【问题标题】:Pointer issues with basic C file I/O program基本 C 文件 I/O 程序的指针问题
【发布时间】:2010-10-14 11:07:50
【问题描述】:
#include <stdio.h>
#include <stdlib.h>

int main() 
{
     FILE *fp = fopen("lr.txt", "r");
     fseek(fp, 0L, SEEK_END);
     int size = ftell(fp);
     fseek(fp, 0L, SEEK_SET);

     char *lorem_ipsum;

     int i = 0;
     lorem_ipsum = (char*) malloc(sizeof(char) * size);
     while(fscanf(fp, "%s\n", lorem_ipsum) != EOF)
     {
      printf("%s", lorem_ipsum[i]);
      i++;

     }
     fclose(fp);
     return 0;
}

这个程序编译并运行,然而,发生的事情是我有一个段错误,我不太清楚这个程序有什么问题。有人可以帮我解决我遇到的指针错误吗?

【问题讨论】:

  • 您是否考虑过在调试器中运行它并查看堆栈跟踪以了解它实际崩溃的位置?

标签: c pointers segmentation-fault


【解决方案1】:

您正试图打印lorem_ipsum[i],就好像它是一个字符串一样。 lorem_ipsum 是一个字符串,所以 lorem_ipsum[i] 只是一个字符。

发生段错误是因为 printf 查看 lorem_ipsum[i] 处的字符值并将其解释为 char* 指针(字符串)。自然,字符的值不对应于有效的分配内存地址。

【讨论】:

  • 分析是正确的 - 但即使更正了代码也会被误导。由于分配了文件的大小,因此一次读取所有文件可能最有意义 - fread() 更合适。带 %s 的 fscanf() 函数很奇怪,即使你使用 %*s。
  • 我猜目的是从文件中读取行并为整个文件分配足够的内存将满足非常长的行。
【解决方案2】:

您将 char (lorem_ipsum[i]) 传递给 fscanf 函数,该函数需要 char* 作为参数。

如果您真的想去掉第一个 i 字符,您可能需要使用 lorem_ipsumlorem_ipsum+i

【讨论】:

    【解决方案3】:

    你能解释一下你在 for 循环中要做什么吗?

    在我看来,您正在尝试逐行读取文件,然后打印该行。 但是,当您执行 printf("%s", lorem_ipsum[i]) 时,您发送的是一个字符,而不是一个字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-25
      • 1970-01-01
      相关资源
      最近更新 更多