为什么malloc未分配指定大小的内存?C语言动态内存分配疑问
问题原因解答
1. 结构体大小为16字节的原因
不是分页机制导致的,是C语言结构体内存对齐规则的要求:
- 你注释里误以为
char *name占1字节是错误的,指针类型的大小由系统位数决定:32位系统占4字节,64位系统占8字节,从你的运行结果看你用的是32位编译环境,指针占4字节。 - 结构体成员需要对齐到自身大小的整数倍地址,同时整个结构体的总大小需要对齐到最大成员(这里是8字节的long long)的整数倍:
- long long distance占8字节
- int numParts占4字节
- char *name占4字节
总大小8+4+4=16,刚好是8的倍数,不需要额外填充,所以最终结构体大小是16字节。
2. sizeof(*spaceShipArray)输出16而非160的原因
sizeof是编译期运算符,只会计算操作数的类型对应的大小,不会读取运行时动态分配的内存大小:
*spaceShipArray的类型是struct spaceShip,所以sizeof(*spaceShipArray)永远等于结构体本身的大小16字节,和你malloc了多少个元素没有关系。- C语言不会记录动态分配数组的总长度,你需要自己额外用变量保存
amount的值来记录元素个数。
3. sizeof(spaceShipArray[0].name)输出4而非100的原因
和上面同理:
name的类型是char*,是指针类型,在32位系统下大小固定为4字节,sizeof只会返回指针本身的大小,不会返回指针指向的动态分配内存的大小。- 如果你要记录
name指向的字符串缓冲区长度,需要自己额外用变量保存分配的字节数,或者用strlen计算实际存储的字符串长度(注意strlen不会算末尾的\0,而且要求字符串必须以\0结尾)。
补充注意事项
你的代码存在内存泄漏:你给spaceShipArray[0].namemalloc了100字节,但是在释放spaceShipArray之前没有释放这块内存,正确的释放顺序是先释放每个结构体的name指针,再释放结构体数组:
// 释放示例 free(spaceShipArray[0].name); free(spaceShipArray);
内容的提问来源于stack exchange,提问作者tec
相关产品推荐
相关产品推荐

