多出来的一个字节往哪里了

多出来的一个字节去哪里了
本帖最后由 w673339759 于 2014-08-16 23:01:00 编辑
多出来的一个字节往哪里了
多出来的一个字节往哪里了
LEN是定义的宏41,多出来的1字节呢?是分配给了info结构的第二个成员么?
------解决方案--------------------
空结构体的大小为1

typedef struct info
{
/* 空结构体 */
}INFO;

int main()
{
printf("%d\n", sizeof(INFO));  // 结果为1
return 0;
}

------解决方案--------------------
数据对齐的原因,你的结构体大小实际是127字节,你自己看别扭不?编译器在对你的程序优化的时候,自动对齐到128个字节大小,这样能够提高程序运行速度,你的程序没有错,只是有一个字节空在那里,永远也永不到了。
------解决方案--------------------
另外,不要在定义41这样古怪的数组长度了,你最好定义成48,这样能够提高程序运行的速度!空的字节就让他空着吧,这就要用空间换时间,至于为这样能够提高程序运行速度,仔细学习学习计算机原理就知道了!
------解决方案--------------------
编译器对变量存储的一个特殊处理。为了提高CPU的存储速度,编译器对一些变量的起始地址做了“对齐”处理。在默认情况下,规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。
类型
对齐方式(变量存放的起始地址相对于结构的起始地址的偏移量)
Char 偏移量必须为sizeof(char)即1的倍数
int 偏移量必须为sizeof(int)即4的倍数
float 偏移量必须为sizeof(float)即4的倍数
double 偏移量必须为sizeof(double)即8的倍数
Short 偏移量必须为sizeof(short)即2的倍数
------解决方案--------------------
字节对齐,没有了!
楼上说的空结构体不对的
------解决方案--------------------
内存自动对齐的原因,这个需要看计算机组成原理
------解决方案--------------------
是对齐的结果。

long的长度是4,struct name被分配4的倍数的空间,比123大的最小的4的倍数是124
所以总长度就是 4 + 124 = 128
------解决方案--------------------
多出来的一个字节往哪里了上面已经回答完了。。。
------解决方案--------------------
内存对齐。
多出来的一个字节往哪里了
多出来的一个字节往哪里了
还有字节在末尾。

《C和指针》、《C常见问题集》、《Linux C 编程一站式学习》等书都有介绍 “内存对齐”。
------解决方案--------------------
内存对齐;
请参考:http://blog.****.net/yusiguyuan/article/details/23104353
------解决方案--------------------
引用:
Quote: 引用:

内存对齐。
多出来的一个字节往哪里了
多出来的一个字节往哪里了
还有字节在末尾

《C和指针》、《C常见问题集》、《Linux C 编程一站式学习》等书都有介绍 “内存对齐”。

long的开始地址和结构体成员的开始地址相差4,即long的大小,我觉的还有必要看下myName的结束地址;
那么为了内存对齐,提高运行效率而补齐字节是不是无法访问到啊?
在64系统下做了个实验,发现long的大小是8,nam结构体大小是123,但是test的大小是136,name的大小不是因该补齐到124么,加上long的8字节是132,为何是136
多出来的一个字节往哪里了多出来的一个字节往哪里了


myName的结束地址应该是以下输出的“结果” -1.
INFO *ptest = &test;
ptest++;
printf("End of myName's address is:%p\n", ptest);

------解决方案--------------------
引用:
Quote: 引用:

内存对齐。
多出来的一个字节往哪里了
多出来的一个字节往哪里了
还有字节在末尾

《C和指针》、《C常见问题集》、《Linux C 编程一站式学习》等书都有介绍 “内存对齐”。

long的开始地址和结构体成员的开始地址相差4,即long的大小,我觉的还有必要看下myName的结束地址;
那么为了内存对齐,提高运行效率而补齐字节是不是无法访问到啊?
在64系统下做了个实验,发现long的大小是8,nam结构体大小是123,但是test的大小是136,name的大小不是因该补齐到124么,加上long的8字节是132,为何是136
多出来的一个字节往哪里了多出来的一个字节往哪里了



printf("sizeof test = %d\n", sizeof(test));
printf("shbzNum start address: %p\n", &test.shbzNum);
printf("myName start address: %p\n", &test.myName);
printf("myName's fName address: %p\n", test.myName.fName);
printf("myName's mName address: %p\n", test.myName.mName);
printf("myName's lName address: %p\n", test.myName.lName);


可以看到到底是哪里出现了 “间隙”。