You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 12:15:10