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

输出:4混淆关于变量的范围用C

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

随着'T'一个typedef,就不会有编译错误。这两个名字将在不同的(嵌套)范围内;内部名称将是'printf()'语句中使用的名称(带有'sizeof'运算符)。 –