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

ViewerP 2014-08-16 11:00:02


LEN是定义的宏41,多出来的1字节呢?是分配给了info结构的第二个成员么?
...全文
175 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
竹影半墙 2014-08-17
  • 打赏
  • 举报
回复
内存对齐。


还有字节在末尾。

《C和指针》、《C常见问题集》、《Linux C 编程一站式学习》等书都有介绍 “内存对齐”。
707wk 2014-08-17
  • 打赏
  • 举报
回复
上面已经回答完了。。。
阿麦 2014-08-17
  • 打赏
  • 举报
回复
是对齐的结果。 long的长度是4,struct name被分配4的倍数的空间,比123大的最小的4的倍数是124 所以总长度就是 4 + 124 = 128
百曉生 2014-08-17
  • 打赏
  • 举报
回复
内存自动对齐的原因,这个需要看计算机组成原理
ViewerP 2014-08-17
  • 打赏
  • 举报
回复
感谢各位,学习了
竹影半墙 2014-08-17
  • 打赏
  • 举报
回复
引用 10 楼 w673339759 的回复:
[quote=引用 9 楼 misskissC 的回复:] 内存对齐。 还有字节在末尾。 《C和指针》、《C常见问题集》、《Linux C 编程一站式学习》等书都有介绍 “内存对齐”。
long的开始地址和结构体成员的开始地址相差4,即long的大小,我觉的还有必要看下myName的结束地址; 那么为了内存对齐,提高运行效率而补齐字节是不是无法访问到啊? 在64系统下做了个实验,发现long的大小是8,nam结构体大小是123,但是test的大小是136,name的大小不是因该补齐到124么,加上long的8字节是132,为何是136 [/quote] 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); 可以看到到底是哪里出现了 “间隙”。
竹影半墙 2014-08-17
  • 打赏
  • 举报
回复
引用 10 楼 w673339759 的回复:
[quote=引用 9 楼 misskissC 的回复:] 内存对齐。 还有字节在末尾。 《C和指针》、《C常见问题集》、《Linux C 编程一站式学习》等书都有介绍 “内存对齐”。
long的开始地址和结构体成员的开始地址相差4,即long的大小,我觉的还有必要看下myName的结束地址; 那么为了内存对齐,提高运行效率而补齐字节是不是无法访问到啊? 在64系统下做了个实验,发现long的大小是8,nam结构体大小是123,但是test的大小是136,name的大小不是因该补齐到124么,加上long的8字节是132,为何是136 [/quote] myName的结束地址应该是以下输出的“结果” -1. INFO *ptest = &test; ptest++; printf("End of myName's address is:%p\n", ptest);
Cyanuestc 2014-08-17
  • 打赏
  • 举报
回复
内存对齐; 请参考:http://blog.csdn.net/yusiguyuan/article/details/23104353
ViewerP 2014-08-17
  • 打赏
  • 举报
回复
引用 9 楼 misskissC 的回复:
内存对齐。


还有字节在末尾。

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

long的开始地址和结构体成员的开始地址相差4,即long的大小,我觉的还有必要看下myName的结束地址;
那么为了内存对齐,提高运行效率而补齐字节是不是无法访问到啊?
在64系统下做了个实验,发现long的大小是8,nam结构体大小是123,但是test的大小是136,name的大小不是因该补齐到124么,加上long的8字节是132,为何是136
max_min_ 2014-08-17
  • 打赏
  • 举报
回复
字节对齐,没有了! 楼上说的空结构体不对的
FeelTouch Labs 2014-08-16
  • 打赏
  • 举报
回复
编译器对变量存储的一个特殊处理。为了提高CPU的存储速度,编译器对一些变量的起始地址做了“对齐”处理。在默认情况下,规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。 类型 对齐方式(变量存放的起始地址相对于结构的起始地址的偏移量) Char 偏移量必须为sizeof(char)即1的倍数 int 偏移量必须为sizeof(int)即4的倍数 float 偏移量必须为sizeof(float)即4的倍数 double 偏移量必须为sizeof(double)即8的倍数 Short 偏移量必须为sizeof(short)即2的倍数
gmxydm 2014-08-16
  • 打赏
  • 举报
回复
另外,不要在定义41这样古怪的数组长度了,你最好定义成48,这样能够提高程序运行的速度!空的字节就让他空着吧,这就要用空间换时间,至于为这样能够提高程序运行速度,仔细学习学习计算机原理就知道了!
gmxydm 2014-08-16
  • 打赏
  • 举报
回复
数据对齐的原因,你的结构体大小实际是127字节,你自己看别扭不?编译器在对你的程序优化的时候,自动对齐到128个字节大小,这样能够提高程序运行速度,你的程序没有错,只是有一个字节空在那里,永远也永不到了。
神奕 2014-08-16
  • 打赏
  • 举报
回复
空结构体的大小为1

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

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

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧