2012-06-14 5 views
0
struct a { 
    int *val; 
}; 

void main(){ 
    int n; 
    struct a *a1; 
    a1= malloc(sizeof(a1)); 

    n=10; 

    a1->val = &n; 

    func(a1); 


    printf("After changing %d\n",a1->val); 

} 

void func(struct a *a2){ 
    int a = 5; 
    a2->val = &a; 
    a2->val = 0 ; 
} 

할당 된 로컬 변수를 멤버 구조체 포인터에 할당합니다. 그리고 결국 그것을 null로 만든다. null 포인터를주는 대신 액세스하려고하면 0을줍니다.구조체의 멤버 포인터에 로컬 변수의 주소가 할당됩니다.

+1

이렇게 소리 치지 않는 한'void main()'을 사용하지 마십시오. –

+0

'NULL'은 기술적으로 '0'입니다. 또한 포인터를 NULL로 설정하지 않고 예제에서 '19'로 설정합니다. –

+1

"마침내 null이 됨"이없고 "a2-> val = 19;"문은 컴파일 타임 오류가 발생합니다. 정말로 묻는 코드를 게시해야합니다. 귀하의 질문에 정말 변수의 수명이 만료 된 후에 포인터를 통해 변수에 액세스하려고 시도하는 정의되지 않은 동작에 대한 것 같습니다. –

답변

0

a1->val이 유효하지 않은 주소를 가리키고 있기 때문에 (19는 거의 유효한 주소가 아님) 정의되지 않은 동작을 호출하고 결과가 허용됩니다 (코어 덤프 또는 기타 충돌 포함).

함수가 한 경우에도 : 포인터가 더 이상 할 때 함수가 반환 유효하지 정수를 가리키는 것

*a2->val = 19; 

. 함수가 종료되면 포인터를 역 참조하는 것이 더 이상 안전하지 않습니다. 당신은 안전하게 그것에 새로운 포인터 값을 할당 할 수 있습니다; 포인터를 다른 포인터 또는 NULL과 비교할 수 있습니다 (일부 제약 조건 적용). 그러나 그것은 모두에 관한 것입니다.

+0

그래서 안전한 동작은 종료하기 전에 a2 -> val null 동작을 만드는 것입니다. – shunty

관련 문제