结构体成员偏移量由声明决定而非malloc函数决定

电子 浏览

结构成员的偏移量由结构的声明决定,而不是由malloc函数决定。C语言sizeof structure size中的结构长度问题,并不是简单的将结构中所有元素所占的空间相加(这与系统内部的数据存储方案有关),例如,声明structA { inta;charbstructA * pA};这个结构占用12字节内存(32位机,我就不说对齐原理了),三个成员的偏移量分别为0。

1、c语言里:sizeof怎样用法?

sizeof,一个丑家伙,引得无数菜鸟弯腰。我当初也没少迷茫,决定用“为我努力,为千千万万人幸福”的大思路尽可能详细地总结一下。但是我总结的时候发现这个问题既可以简单也可以复杂,所以这篇文章有些地方不适合初学者,没必要大惊小怪。但如果你想“知其所以然,知其所以然”,那么这篇文章或许对你有所帮助。

2、字节对齐的规则有没有一个总结性的说明?

这些东西大部分都可以自由调节。如果写程序的时候不加具体的修饰语,那就是“错误的种子”或者隐含的错误。比如我朋友曾经写过这样一段代码:ii;五年后,我花了整整一个星期才找到这一行错误的代码(正确的是我)。它的性能会在不同的编译器和不同的优化选项下发生变化!当你把这些事情做的更深入的时候,你就会知道,有些技能是很少用的,用的越多,维护期就要做的越多。

3、问题一:chartest[4]是向内存开辟了4个字节么?问题二:一个字节=8...

我应该对齐什么?在现代计算机中,内存空间是按字节划分的。理论上,似乎对任何类型变量的访问都可以从任何地址开始,但实际情况是,访问特定类型的变量时,往往是在特定的内存地址进行访问,这就要求所有类型的数据都要按照一定的规则在空间上进行排列,而不是一个一个按顺序排出。这是对齐。对齐的作用和原因:每个硬件平台上对存储空间的处理有很大的不同。

例如,一些体系结构在访问未对齐的变量时会出现CPU错误,因此在这种体系结构中编程必须确保字节对齐。其他平台可能没有这种情况,但最常见的是,如果数据存储没有按照适合自己平台的要求对齐,会带来访问效率的损失。比如有些平台,每次读取都是从偶数地址开始。如果将int类型(假设为32位系统)存储在偶数地址的开头,则32位数据可以在一个读周期内读取,而如果存储在奇数地址的开头,则需要两个读周期,两个读取结果的高、低字节可以拼接在一起得到32位数据。

4、C语言:生成的可执行文件中有结构体的某种描述形式吗?

structure成员的偏移量是由结构的声明决定的,而不是由malloc函数决定的。例如,声明structA { inta;charbstructA * pA};这个结构占用12字节内存(32位机,对齐原理我就不说了),三个成员的偏移量都是0,这是声明的时候决定的,而malloc只负责分配12字节内存。

5、...char*

sizeof()捕获内存大小。不同的操作系统有不同的大小,一般情况下,int占用两个字节。也就是说sizeof(int)的结果是2sizeof((char*)0(char*)0)char的四次运算会转换成int运算,所以这个结果也相当于int的大小,也就是说结果是2sizeof((char*)0(char*)0)。