2012-01-16 8 views
2

저는 C가 처음이므로 실수가 있으면 바로 잡으십시오. 여기 C 구조체 변수 할당?

왜 그것을이다 나는

//typdef stuff for apple, *apple_t here 
apple_t get() { 
    apple a; 
    a.num = 0; 

    apple_t ap = &a; 
    printf("set num to %d\n", ap->num); 
    return ap; 
} 

// ap above is placed into read(ap) 
void read(apple_t ap) { 
    printf("num: %d\n", ap->num); 
} 

이 코드와 같은 종류의의 일부 코드의 그 인쇄를 "설정"에 대한 AP-> NUM == 0,하지만 난 읽기 기능 에서의 printf를 수행 할 때 -1218550893과 같은 정크 번호가 있습니까? 무슨 일이야? 정수가 해제되어 있습니까? C는 무엇을하고 있습니까? 어떻게이 문제를 해결합니까?

+6

C에서 잘 알려진 실수 인 로컬 변수 * 주소를 반환합니다. – Jon

+0

코드에 [dangling pointer]가 있습니다 (http://stackoverflow.com/questions/5278859/c-dangling). -pointer-question). –

+0

가능한 [로컬 변수의 메모리가 범위 외부에서 액세스 될 수 있습니까?] (http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope) – Jon

답변

9

로컬 변수의 주소를 반환합니다.

이 경우 변수 a은 로컬 변수입니다. 함수가 끝난 후에는 손실됩니다. 값을 기준으로

  1. 반환을 :

    는이 문제를 해결하는 두 가지 옵션이 있습니다. 주소를 반환하지 마십시오.

  2. malloc()을 사용하여 메모리를 할당하십시오. 그러나 나중에 free()으로해야합니다.
+0

나는 항상 이것을 해왔 던 프로그래머와 함께 일했다 - 그의 주장은 그것이 99 %의 시간을 보냈다는 것이 었습니다! –

+0

아니요,'ap'는 지역 변수 'a'의 주소를 가지고 있습니다. –

+0

@JeffMercado 아, 네 말이 맞아. – Mysticial

0

함수가 반환 된 후에 사용할 수없는 지역 변수가 반환됩니다.

C는 구조체를 반환 지원하므로 전혀 포인터에 대한 필요 :

apple_t get() { 
    apple_t a; 
    a.num = 0; 
    return a; 
} 

다음 코드는 로컬 변수를 반환하지, 그 결과를 복사하지 않습니다.