gpt4 book ai didi

c - 当我将指针初始化为NULL时,运行结果很奇怪

转载 作者:行者123 更新时间:2023-11-30 21:32:33 25 4
gpt4 key购买 nike

据说我们最好用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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com