据说我们最好用NULL初始化一个新指针,否则会出现意想不到的结果。但事实是,当我添加NULL
时,如下所示:
#include <stdio.h>
int main(){
char *str = NULL;
gets(str);
printf("%s\n", str);
return 0;
}
结果是:
Segmentation fault: 11
虽然我只是保留新指针,如下所示:
#include <stdio.h>
int main(){
char *str;
gets(str);
printf("%s\n", str);
return 0;
}
没关系!我可以得到我写的内容。 我想知道这背后的原因。
最佳答案
正如所有评论所示:
C 不会为你处理内存
你必须自己做。
由于您声明了一个指向字符串的指针,因此您必须确保该指针指向属于您的内存。
当您将 NULL 分配给指针时,它指向“禁止”内存地址零,并尝试在那里放置某些内容(使用
gets
)导致内存管理拦截您不允许的尝试并中止您的程序;当你没有给它分配任何东西时,它是一个未初始化的局部变量,它有一个垃圾值(指向一个随机地址),你可以在其中存储读取的字符串
gets
但这可能会在程序中的任何后续时刻导致任何随机行为,称为未定义行为。您写入的内存可能是您的,但不受管理(那里还存储了其他内容)。
有两种方法可以解决这个问题:
向堆请求内存(使用
malloc
),例如char *str= malloc(1024);
声明一个足够大的缓冲区,例如
char str[1024];
.
并且不要使用gets
。这是不安全的。使用fgets
。
关于c - 当我将指针初始化为NULL时,运行结果很奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49084265/