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

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字节内存外写数据时,只要那块内存暂时没被其他程序或系统占用,数据就能存进去,甚至能正常读出来。但这只是“运气好”,这种行为极度危险——后续如果其他代码用到了这块被你越界占用的内存,会直接导致数据错乱、程序崩溃,甚至触发安全问题,而且这类问题极难排查。

你的代码核心问题

  1. initialize函数完全忽略了传入的cap参数,只分配了1字节内存,和你期望的容量逻辑完全脱节。
  2. addElement没有做边界检查,也没有实现动态扩容逻辑,内存不够时直接越界写入。

修复建议

  • 初始化时根据cap分配对应大小的内存:list.string = malloc(sizeof(char) * cap);
  • 在addElement里先判断index是否等于capacity,如果是,用realloc进行扩容(比如把容量翻倍),再存储新字符。
  • 注意:字符数组最后要手动添加'\0'作为字符串结束符,否则打印时会出现乱码。

内容的提问来源于stack exchange,提问作者Jethro Cenas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 15:35:24