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

标签 c pointers null

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

相关文章:

C从字符串中解析一个巨大的int数组

c - 在 32 位模式下使用 64 位 uint 作为指针值?

pointers - 如何在 go 中获取字符串变量的数据指针?

c++ - 将 NULL 指针强制转换为对象并调用其成员函数之一是否有实际好处?

sql - 创建表时 IDENTITY NOT NULL

c - 如何使用指针打印元素

c++ - 变量、指针、对象和内存地址 : Why do I get this strange result?

Objective-C - 更改传入对象指针的地址

c - 我正在尝试从由制表符分隔的文本文件中获取数据。但我无法得到结果

c++ - Google Protocol Buffer 序列化字符串可以包含嵌入的 NULL 字符吗?