C语言未执行realloc分配额外内存却未触发错误是什么原因
问题解释
- 这是C语言典型的未定义行为:C语言本身没有内置内存越界检查机制,访问超出申请范围的内存时,标准没有要求必须抛出错误,实际运行表现完全取决于当前环境的内存状态、编译器实现和操作系统规则。
- 你可以计算下字符串拼接后的总内存需求:
- 第一次
strcpy写入的"Zara li a DPS student.",加上末尾的字符串结束符\0总共占用23字节 - 后续
strcat追加的"She is in class 10th."总共占用21字节 - 两者相加总长度为44字节,已经远超你最初
malloc申请的30字节空间
- 第一次
- 注释掉
realloc后程序还能正常输出完全是巧合:你越界写入的那部分堆内存,刚好没有被系统分配给其他程序/变量使用,也没有触发操作系统的内存页保护机制,所以暂时没有出现崩溃、输出乱码等异常,但这绝不代表代码逻辑是正确的。 - 这种堆内存越界写入属于典型的内存安全问题,在实际使用中可能导致程序随机崩溃、数据被篡改,严重情况下还会出现堆溢出漏洞被恶意利用。如果取消
realloc的注释,将内存扩容到100字节,就可以容纳拼接后的全部内容,属于合法的内存操作。
补充建议
- 标准C中不需要强制转换
malloc/realloc的返回值,额外强转反而可能隐藏部分潜在的类型错误 - 涉及字符串拼接、内存写入的场景,建议提前计算所需的内存大小,主动做边界校验,避免出现内存越界问题
内容的提问来源于stack exchange,提问作者eyebrowkang
相关产品推荐
相关产品推荐

