C 语言数据类型大小和结构体中变量
的地址分配方法
点击:
数据类型: char short int long float double (long double)
gcc3.2.2:
1 2 4 4 4 8 12
Visual C++:1 2 4 4 4 8 8
对于数组的大小也比较简单,定义数组 int a[10]后,sizeof(a)为所有数组元素大小
之和,所以在 Visual C++下其值为 40
,但是有一种特殊情况:
void function (int array[10]) { printf("%d\n",sizeof(array)); }
int main(int argc , char *argv[])
{
int array[10];
function(array);
return 1;
}
这 里的输出结果是 4,因为 C 语言在数组作为参数的时候传递的只是地址,也就
是在 function 这个函数用到的 array
只不过是个指针变量,其结果返回是 4,因为:
在 Win32 平台上地址为 32 位即指针变量的大小为 4 字节。顺便提一下关于 main
中那两个形式参数的意义,假定此 main
函数编译后为 Test.exe 的入口。如果在命
令行模式(Windows 下为 cmd,Linux 下的 shell)运行时,如果你输入 Test 字符
串 1 字符串 2
, 那么系统在调用此 main 函数时就会把 3 传给 argc(调用此程序的
参数个数输入了 3 个,程序名也算作一个参数),把 “Test”“ 字符串 1”“
字符 串
2”存入字符指针数组 argv 中,在 main 函数中就可以使用这些传入的参数了,这
样的例子有很多,比如在命令行下运行 copy 命令时就会输入
copy sourcefile destinationdirectory
。
共用体变量的所占字节数为最大数据类型成员的大小,例如
union Union { int i,
char ch}; Union test; 则 test 的大小为 4(int 类型的大小)
。
枚举类型变量大小为 4 字节,本人猜测:编译器为了较好的处理字节对齐问题,
将枚举类型变量的大小处理为 4,不过至今还没有看到过相关的解释。
结构体类型变量的大小问题是一些公司招聘的时候很受青睐的题目。(本人在
一次笔试中和在参加一本数据结构书的校对过程中曾碰到这个问题,遂写此文)
在谭的 书中没有涉及到这个问题,严格的说这是个跟编译器字节对齐关系挺大
的问题,网上可以搜到很多类似问题的讨论。为了使 CPU 对变量的进行快速高
效的访问,变 量的起始地址应该满足某些特性,即所谓的对齐。关于字节对齐
有两个重要的宏,#pragma pack (n)和#pragma pack
第一个宏是强 制编译器一般以
n 的倍数进行地址对齐(还有特殊情况以小于 n 的字节数进行对齐),第二个宏
结束前面设置的对齐方式,恢复到编译器默认的对齐方式。在 Visual C++下默认
的字节对齐数为 8。
C 语言数据类型大小和结构体中变量