2017-02-23 14 views
0
Code 1 
#include <stdio.h> 
int T; 
int main() 
{ 
    struct T{ double x;}; 
    printf("%d", sizeof(T)); 
    return 0; 
} 

Выход: 4Смешение об объеме переменных в С

Code 2 
#include <stdio.h> 
struct T{ double x;}; 
int main() 
{ 
    int T; 
    printf("%d", sizeof(T)); 
    return 0; 
} 

Выход: 4

Для code 1 я считаю, что выход размер глобальной переменной (int T), поэтому он дает 4.

Но для code 2 он дает выход 4 в соответствии с глобальной логикой переменных, он должен выводиться 8 для struct T{ double x;};.

Здесь понятие глобальной переменной неверно - я думаю.

Может кто-нибудь объяснить это, почему результат выглядит?

ответ

2

Проблема здесь не в области, а в том, как структуры тегов живут в другом пространства имен, чем другие символы.

Из-за этого, когда вы делаете sizeof(T) вы всегда получить переменную T.

Чтобы получить тег структуры в C, вам нужно ключевое слово struct. Как в sizeof(struct T).


Все было бы иначе, если бы вы использовали typedef:

struct T 
{ 
    double x; 
} T; 

Тогда вы бы иметь тип с именем T в «нормальном» пространства имен. С другой стороны, этот тип конфликтует с переменной с тем же именем, поэтому вместо этого вы получите ошибку компилятора.

+1

С typedef для 'T', не было бы ошибки компилятора. Эти два имени будут находиться в разных (вложенных) областях; внутреннее имя будет использоваться в операторе 'printf()' (с оператором 'sizeof'). –

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