C语言中为何仅分配1个char空间却能存入多个字符?
问题描述
我仅为string初始化了1个char的内存空间,但却能够存入超出该数组容量的字符。我添加了11个字符元素,不仅成功存入,还能在终端正常打印。尝试添加更多字符也未触发错误。根据我的认知,char仅能存储单个字符,但实际却能存入一个单词,对此我感到困惑。
相关代码:
struct ArrayList { char* string; int index; int capacity; }; array initialize(int cap) { array list; list.index = 0; list.capacity = cap; list.string = malloc(sizeof(char)); return list; } void addElement(arrayPtr list, char c) { list->string[list->index] = c; list->index += 1; }
这是典型的内存越界访问行为,属于C语言里的未定义行为,不是你真的突破了char的存储限制。
为什么没报错还能正常打印?
C语言本身不会自动检查内存边界,当你往malloc分配的1字节内存外写数据时,只要那块内存暂时没被其他程序或系统占用,数据就能存进去,甚至能正常读出来。但这只是“运气好”,这种行为极度危险——后续如果其他代码用到了这块被你越界占用的内存,会直接导致数据错乱、程序崩溃,甚至触发安全问题,而且这类问题极难排查。
你的代码核心问题
initialize函数完全忽略了传入的cap参数,只分配了1字节内存,和你期望的容量逻辑完全脱节。addElement没有做边界检查,也没有实现动态扩容逻辑,内存不够时直接越界写入。
修复建议
- 初始化时根据
cap分配对应大小的内存:list.string = malloc(sizeof(char) * cap); - 在
addElement里先判断index是否等于capacity,如果是,用realloc进行扩容(比如把容量翻倍),再存储新字符。 - 注意:字符数组最后要手动添加
'\0'作为字符串结束符,否则打印时会出现乱码。
内容的提问来源于stack exchange,提问作者Jethro Cenas
相关产品推荐
相关产品推荐

