【问题标题】:Why wont this simple C program print? [duplicate]为什么这个简单的 C 程序不打印? [复制]
【发布时间】:2018-07-17 04:34:53
【问题描述】:

我正在尝试制作一个基本的 C 程序来从文件中读取,但由于某种原因,当我使用 make Test1 然后运行它时 ./Test1 test1.txt 我得到“错误:'s' may be used uninitialized in这个函数”。

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

int main (int argc, char** argv) {


    if (argc < 2) {
        printf("error\n");
        return 0;
    }

    FILE *fp = fopen(argv[1], "r");

    if (fp == NULL)  {
        printf ("error\n");
        return 0;
    }

    char * s;

    int r = fscanf(fp, "%s", s);

    while (r != EOF) {
        printf("%s\n", s);
        r = fscanf(fp, "%s", s);
    }

    return 0;
}

【问题讨论】:

  • 程序编译后如何启动?
  • 尝试添加断点并调试。
  • char * s 现在没有指向任何东西。

标签: c printing


【解决方案1】:

问题出在 fscanf 上。它不会分配任何内存,您必须自己执行此操作,例如通过做

char *s = malloc(100);  //array s is stored in the heap memory

char s[100];  //array s is stored in the stack

为了确保 fscanf 不会读取超过 100 个字符(因为这是我们获得的内存量),您必须编写

int r = fscanf(fp, "%99s", s); 

【讨论】:

【解决方案2】:

当您读取设置为 NULL 的 s 时它应该会崩溃,这意味着您没有留出可供读取的内存,它应该会导致您的程序崩溃,具体取决于操作系统取决于错误

char s[1000]至少给它一些内存来读。

【讨论】:

  • 是的,上传时我还在测试代码。删除了 NULL,但我仍然被告知“s 可能未初始化”。
  • @AlanGhalan, s 未初始化。你需要初始化它。
  • @lurker 出于某种原因,OP 更改了代码,如果您检查历史记录,它被分配为 NULL
  • @lurker 看起来确实如此,并且 OP 更改了它。阅读this comment
  • 我明白了,谢谢。我参加聚会有点晚了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-10
  • 1970-01-01
  • 2019-05-18
相关资源
最近更新 更多