background image

语言数据类型大小和结构体中变量

的地址分配方法

点击:

855   发布日期:2007-9-11 13:47:06   

进入论坛

数据类型: 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。
 

语言数据类型大小和结构体中变量