【发布时间】:2013-01-22 14:39:46
【问题描述】:
我想编写一个小程序,用户通过 argv 输入时,会出现分段错误。我对 C 很陌生,但我认为以下代码可以完成这项工作:
int main(int argc, char *argv[])
{
int bufferSize;
char * buffer[100];
unsigned int i;
if (argc > 1) {
bufferSize = atoi(argv[1]);
for (i = 0; i < bufferSize; ++i)
*( buffer + i ) = i;
}
return 0;
}
我的想法是程序初始化(?)一个指向特定大小缓冲区的指针。如果用户然后输入一个大于缓冲区大小的数字,它将写入未初始化的内存,因此得到一个段。过错。这个推理是否正确?
附言。编译时,I get a assignment makes pointer from integer without a castwarning,有人可以告诉我为什么会这样吗?谢谢
【问题讨论】:
-
写入未分配的内存是未定义的行为,因此它实际上可能不会崩溃。或者它会因总线错误而崩溃,或者可能会发生其他事情。
-
如果我是你,我会选择
*(char *)0 = 0;- 还要注意这是UB,我。 e.您不能期望对程序的行为进行任何推理或解释。 -
(在大多数系统上)缓冲区在堆栈上,所以如果你写到最后你会破坏你的堆栈,而不是写入未分配的内存。
标签: c memory memory-management segmentation-fault