我刚刚使用Cygwin的gcc编译了这个C程序:
#include <stdio.h>
void main (){
char *str;
gets(str);
printf("%s",str);
}
放弃gets
弃用消失了,这应该会破坏,因为我没有为str分配任何内存,但即使输入很长也能正常工作。例如,如果我设置了char str [16],它会在超过分配的长度后中断几个字符。
为什么我没有出现分段错误?
答案 0 :(得分:9)
未初始化指针指向的访问内存区域是未定义的行为,它可能会崩溃,它也可能看起来像正常工作。总之,你无法预测它的行为。
为什么我没有出现分段错误?
未初始化的指针有一个未确定的值,它可以指向任何地方,如果它意外地指向一个足够大的可写区域,该程序将正常“工作”。
答案 1 :(得分:1)
变量str
具有未定义的值。这意味着它只是在堆栈上获得一个位置,而那里的值恰好在这个变量中。你的行为的一个可能的解释是,一个内置函数初始化进程环境并调用你的main
使用这个地方一个有意义的指向一些可访问的内存。此指针的值保留在堆栈上,当调用main时,str
获得了此值。但这只是可能的解释之一。