2012-01-16 4 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

Ваш код имеет [обвисший указатель] (http://stackoverflow.com/questions/5278859/c-dangling -указатель-вопрос). –

+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% случаев - facepalm! –

+0

Нет, 'ap' удерживает адрес локальной переменной' a'. –

+0

@JeffMercado Ahhhh, ты прав ... исправление. – Mysticial

0

Вы возвращаете локальную переменную, которая не доступна после возвращения функции.

C поддерживает возвращение структур, поэтому нет необходимости в течение указателей на всех:

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

Следующий код будет скопировать результат, не возвращает локальную переменную.

Смежные вопросы