使用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
相关产品推荐
相关产品推荐

