进入没有malloc的char * str,没有segfault?

时间:2014-03-26 06:40:58

标签: c string malloc stdin

我刚刚使用Cygwin的gcc编译了这个C程序:

#include <stdio.h>

void main (){
    char *str;
    gets(str);
    printf("%s",str);
}

放弃gets 弃用消失了,这应该会破坏,因为我没有为str分配任何内存,但即使输入很长也能正常工作。例如,如果我设置了char str [16],它会在超过分配的长度后中断几个字符。

为什么我没有出现分段错误?

2 个答案:

答案 0 :(得分:9)

未初始化指针指向的访问内存区域是未定义的行为,它可能会崩溃,它也可能看起来像正常工作。总之,你无法预测它的行为。

  

为什么我没有出现分段错误?

未初始化的指针有一个未确定的值,它可以指向任何地方,如果它意外地指向一个足够大的可写区域,该程序将正常“工作”。

答案 1 :(得分:1)

变量str具有未定义的值。这意味着它只是在堆栈上获得一个位置,而那里的值恰好在这个变量中。你的行为的一个可能的解释是,一个内置函数初始化进程环境并调用你的main使用这个地方一个有意义的指向一些可访问的内存。此指针的值保留在堆栈上,当调用main时,str获得了此值。但这只是可能的解释之一。

相关问题