初始化指针时,C-fgets不等待输入

时间:2017-10-20 06:11:19

标签: c string pointers memory-management io

我正在制作非常基本的程序来检查fput和fgets是如何工作的,并且发生了一些奇怪的事情。以下代码工作正常:

#include <stdio.h>
#include <stdlib.h>

int main () {

    char* word;
    char* a;
    int k = 3;

    fgets(word, k, stdin);
    fputs(word, stdout);

    free(word);

    return 0;
}

by&#34; fine&#34;我的意思是程序等待输入,然后打印输入(最多2位数 - 因为最后一个是&#39; \ 0&#39;我假设 - )所以这没关系。我知道char * a是未使用的。

我觉得奇怪的是,当我初始化char * a = NULL时,新代码是:

#include <stdio.h>
#include <stdlib.h>

int main () {

    char* word;
    char* a = NULL;
    int k = 3;

    fgets(word, k, stdin);
    fputs(word, stdout);

    free(word);

    return 0;
}

现在fgets不等待stdin输入。我甚至没有使用char * a,所以我不知道这个初始化怎么会导致任何问题。有谁能解释一下?欢迎对提交的代码提出任何其他更正/建议!

1 个答案:

答案 0 :(得分:3)

在这两种情况下,您的代码都会调用 Undefined Behavior ,因为您试图将输入存储在不指向任何内存块的指针中!这解释了你观察到的不一致。

改变这个:

char* word;

到此:

char* word = malloc(sizeof(char) * 3);

或者,更好的是,使用一个数组:char word[k];,或者使用一个常数(可能更大的线长度 - 我建议4096,部分是为了减震,但主要是因为它不会造成麻烦并且会避免麻烦)。