C语言调用malloc()传参时为什么需要使用sizeof()?
为什么malloc申请存储3个int的内存时必须搭配sizeof(int)
首先你得先搞懂malloc的基本工作逻辑:
- 它接收的参数是你要申请的连续内存总大小,单位是字节,和你要存什么类型的数据完全没关系
- 它不会自动判断你要存的元素类型、单个元素占多大空间,只会严格按你传的字节数划一块内存给你,返回这块内存的首地址
两种写法的实际效果差异
教材里的标准写法:
int *list = malloc(3 * sizeof(int));
sizeof(int)是C语言内置的运算符,编译阶段就会自动算出当前编译目标环境下,一个int类型变量占用的字节数:
- 现在常用的32位、64位系统里,
int一般占4字节,算下来总申请大小是12字节,刚好能放下3个int值,内存大小和需求完全匹配。 - 这种写法天然跨平台:哪怕是老式16位系统里
int占2字节,或是特殊架构下int占8字节,编译器都会自动算对需要的总内存,不需要手动改数值。
你写的简化写法:
int *list = malloc(3);
本质是只申请了3字节的内存,远远不够存3个int:
- 按最常见的4字节
int算,光存第一个int就需要4字节,你只拿了3字节的空间,从往list[0]写值开始就已经越界访问内存了。 - 这种越界属于C语言里的未定义行为:轻则把相邻内存里存的其他变量、程序运行数据覆盖掉,导致程序输出莫名其妙的错误结果;重则触发操作系统的内存保护机制,程序直接崩溃报段错误。
- 不要觉得“我试了下写3也能跑”,那只是刚好你申请的3字节后面的那段内存暂时没被其他程序、其他代码占用,属于侥幸,本质是随时会触发的严重内存bug。
注意:C语言标准从来没规定
int的固定长度,只要求它最少能表示-32767到32767的整数范围(也就是最少占2字节),直接写死固定数字当malloc参数,换个编译环境、换个硬件架构就会出问题,用sizeof计算目标类型的单元素大小,再乘元素个数,是C语言动态内存申请的标准规范写法。
内容的提问来源于stack exchange,提问作者gigaSecure
相关产品推荐
相关产品推荐

