2015-06-10 2 views
2

У меня возникла странная проблема. У меня есть модуль, скажем x.c и это образец фрагмент кода:Изменен адрес статической глобальной переменной?

typedef struct lat {  
    int x; 
    int y; 
    int z; 
} lat; 

static lat x; 

static void populate(int x, int y, int z) { 
    lat *pLat = &x;   
    printf(" The value of pLat is %p \n", pLat); 

    pLat->x = x; 
    pLat->y = y; 
    pLat->z = z; 
} 

extern dump_report(void *pPayload) { 
    lat *pLat = &x;   
    printf(" The value of pLat is %p \n", pLat); 

    memcpy(pPayload, pLat, sizeof(lat)); 
} 

адрес глобальной переменной разные (printf s), в этих двух функций? populate() вызывается внутри модуля и дает правильные значения, а dump_report() вызывается из другого модуля и дает неправильный адрес глобальной переменной и нулевые значения.

Может ли кто-нибудь сообщить мне, если я что-то неправильно делаю?

+3

Как вы определили, что адрес, напечатанный 'populate', является правильным адресом? (Подсказка: это не так.) – hvd

+0

Используете ли вы компилятор C или C++ - ваш код выглядит как C, но вы тоже отметили C++, что, я думаю, необоснованно. –

ответ

13

Вы маскировка ваши глобальные x с местным int x из вашего определения функции:

static void populate(int x, int y, int z) 

Просто переименуйте int x.

+1

Обратите внимание, что если компилятор выдавал надлежащую диагностику, назначение «& x» указателю несовместимого типа было бы ошибкой; ни C, ни C++ не имеют такого автоматического преобразования. –

+0

Ну, «правильная диагностика» допускает предупреждения, и многие компиляторы C допускают такие преобразования только с предупреждением, а не с ошибкой. Тем не менее, OP действительно нуждается в проверке любых сгенерированных предупреждений. – hvd

4

Локальные переменные имеют приоритет над глобальными. поэтому вы должны переименовать int x или static lat xenter image description here

И я бы предложил использовать лучший компилятор.

1

Глобальная статическая переменная хранится в .BSS, так как она инициализируется нулем. Но Local variable хранится в памяти стека. Таким образом, адреса памяти будут разными. Обе переменные имеют одинаковое имя, но они хранятся в другой памяти, поскольку они различны в контексте программирования. Переименование переменной будет служить вашей цели.

0

Если глобальная и локальная переменные имеют одно и то же имя, то локальной переменной присваивается предпочтение по глобальной переменной каждый раз.

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