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

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

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

抛弃gets弃用已经过时了,这应该打破,因为我没有为str分配任何内存,但它甚至可以用很长的输入。 例如,如果我设置了char str [16],它会在超过分配的长度后中断几个字符。

为什么我没有得到分段错误?

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

为什么我没有得到分段错误?

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

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