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

使用new分配内存后触发Segmentation fault,疑惑为何非垃圾值

段错误原因解析

先看你的代码:

int main() {
  const char* const *matrix = new(char*);
  std::cout << matrix[0][0]; // segfault here
  return 0;
}

问题出在这几点:

  • new(char*)只分配了一个char*大小的内存块,但这个块里的内容是完全未初始化的垃圾值。也就是说,matrix指向的是一个存放着随机地址的指针。
  • 当你写matrix[0]时,本质是取这个随机地址(因为matrix[0]等价于*(matrix)),接着访问[0]就是去读取这个随机地址指向的内存区域。
  • 这个随机地址几乎不可能是当前进程有权限访问的有效内存——要么是系统保护的地址空间,要么是不属于你的进程的内存,操作系统会直接触发段错误终止程序,而不是让你读到垃圾值。

你之所以以为会返回垃圾值,是混淆了两种情况:如果matrix[0]指向的是一块合法但未初始化的内存,那访问它会得到垃圾值;但这里matrix[0]本身就是个无效地址,直接触发了内存访问违规。

简单总结:

  • 你只分配了单个指针的空间,却没给这个指针赋值有效地址
  • 访问这个未初始化指针指向的内存,触发了内存访问权限错误

内容的提问来源于stack exchange,提问作者Artyom Gevorgyan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 23:12:33