【问题标题】:scanf is using an uninitialized variable; C [duplicate]scanf 正在使用未初始化的变量; C [重复]
【发布时间】:2014-11-04 21:51:19
【问题描述】:

我确定这里只是一个愚蠢的错误,但是,我无法弄清楚。 这是我的代码的一部分:

char *moving;
scanf("%s", moving);

当我用 gcc 编译它时,它会说:

newmatrix.c:38:7: warning: ‘moving’ is used uninitialized in this function [-Wuninitialized]

第38行是scanf

我该如何解决这个问题? 谢谢

【问题讨论】:

  • moving 是一个指针。它指向什么?没有。这就是编译器试图告诉你的。

标签: c char initialization scanf


【解决方案1】:

您可以在调用scanf() 之前分配内存。例如:

char moving[256];
if (scanf("%255s", moving) != 1)
    …oops — presumably EOF…

您可以使用malloc() 代替简单的数组,但是您必须记住释放分配的内存。 OTOH,如果您想从读取数据的函数返回数据,使用malloc() 可能更方便,但请考虑将指向空间(及其大小?)的指针传递给函数。

或者您可以让 scanf() 为您分配内存(请仔细查看 scanf() 的手册页 - 每周阅读,直到您记住(足够)它):

char *moving;
if (scanf("%255ms", &moving) != 1)
    …oops — probably EOF, but perhaps OOM (out of memory)…
…use moving…
free(moving);

是的,这是 POSIX 标准 scanf() 中鲜为人知的选项之一;它不是标准 C 的一部分。

【讨论】:

    【解决方案2】:

    在使用之前为moving 分配内存。使用malloc()

    movingchar 类型的指针。在将字符串存入moving之前,需要为其分配内存。

    char *moving;
    moving = malloc(100); 
    scanf("%s", moving);
    

    只需将char *moving 更改为char moving[256]

    也可以用fgets()代替scanf()

    【讨论】:

    • 最好使用scanf("%99s",moving);,但我会推荐getline(这与scanf 不同,后者在空格处停止)。
    【解决方案3】:

    在使用前为指针分配内存

    char *moving;
    moving = malloc(100*sizeof(char));
    scanf("%s", moving);
    

    【讨论】:

    • sizeof(char) 根据定义为 1。为什么malloc?鉴于问题中的信息,char moving[100]; 也同样有效。
    • 我给了 malloc,因为他似乎想使用指针。而且,sizeof(char) 定义为 1,这就是为什么我给 100*sizeof(char)
    • 嗯,OP也被一个很简单的警告弄糊涂了,所以他好像是个初学者,他想用的不一定是他的应该使用。你故意写了100 * 1,因为它比写100更有表现力?
    • 我写了 100 * 1 是为了让他知道在 malloc 调用中使用 sizeof 是一种更好的做法。
    猜你喜欢
    • 2013-02-22
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    相关资源
    最近更新 更多