char?acLineBuff[1024 1];
printf("%d",?sizeof(acLineBuff));
结果是什么呢?绝大多数情况下应该是1025,但绝不是唯一确定的结论,要具体看C编译器使用的数据模型是什么,当然假如acLinBuff[]是一个函数的形参其结果又有不同。
所以我的回答实际上超过了题主的问题范围,就算是一个理工男的无聊喧嚣吧。
一、sizeof(char)的结果与C编译器的实现有关
各种各样的软硬件平台上几乎都可以看到C编译器的身影,这也就造成了不同的软硬件平台上数据的存储方式、宽度都可能会有所区别。
因此就有了LP32、ILP32、LP64、ILP64和LLP64等等不同的数据模型。尽管我在此列出的这几个数据模型中,char类型都是8位(1?byte)的存储空间,而且几乎所有的数据模型也都是如此定义,但这绝不表示在任何平台上都会有此结果。
同理,对于int、long、double、指针等类型来说,其结果并不是一成不变的,具体要看C编译器实现使用的数据模型。
那我们要如何确定的保证自己使用的变量一定是某种数据宽度呢?stdint。h中包含了类似于下图(我使用的C/C 编译器是MinGW?W64):
这类关于数据宽度的类型定义(使用typedef完成)。
如果我们需要做跨平台开发时,需要保证数据的类型宽度不能有差别,就需要使用stdint。h中定义的各种类型定义。
二、sizeof(acLineBuff)的结果与acLineBuff[]的用法有关
题主到这里一定还是不明白,为什么讨论sizeof(acLineBuff)时一定要说char和指针呢?听我娓娓道来:
1。
?char?acLineBuff[1024 1]是一条声明数据的表达式
假如acLineBuff的声明类似于下面这样:
char?acLineBuff[1024 1];
那么,acLineBuff[]就是一个char数组,因此sizeof(acLineBuff)的结果实际上就是acLineBuff[]这个数组占用的字节数(How?many?Bytes?)。
此时,又回到了之前的问题:char的存储空间是多大?对于大多数X86下C编译器实现来说(采用ILP32或ILP64),sizeof(char)都是1。所以绝大多数情况下,sizeof(acLineBuff)的结果都应该是1025。
2。
?char?acLineBuff[1024 1]是函数声明中的形式参数
假如,acLineBuff是像下面这样声明和使用:
void?foo(char?acLineBuff[1024 1]);
那么,acLineBuff就是一个函数的形式参数(之后简称形参)。
C语言中如果函数的形参是一个数字,那么会被当做一个指针来理解。所以下面的几个函数声明完全等价:
①?void?foo(char?acLineBuff[1024 1]);
②?void?foo(char?acLineBuff[1]);
③?void?foo(char?acLineBuff[?]);
④?void?foo(char?*acLineBuff);
尽管函数的形参中,数组和指针完全等价,但在实际编码一个函数时我们会强调出形参到底是一个指针还是一个数组。
所以,假设char?acLineBuff[1024? ?1]是一个形参的话,sizeof(acLineBuff)的结果就是一个指针的存储空间。对于X86平台来说,大多数32位C编译器的指针会使用32位表示(4?bytes),大多数64位C编译器的指针会用64位表示(8?bytes)。
所以,printf("%d",?sizeof(acLineBuff));的结果,在大多数情况下是4或8。
图片显示的有点问题,其中内容是定义了一些数据类型。比如:
uint8_t、int8_t、uint16_t、int16_t、uint32_t、int32_t、intmax_t、uintmax_t
其中,uint代表是无符号数,int则是有符号数,8、16、32代表数据宽度。
。
全部