2

因此,我一直在尝试以各种不同的方式将其用于分配工作,但每次我都会遇到不同的错误。基本上我们所拥有的是一个程序,它需要逐字节读取将通过管道输入的文件的内容(文件长度可能很大,所以我们不能只调用 malloc 并分配一大块空间)。我们需要使用 realloc 来扩展释放的内存量,直到到达文件末尾。最终结果应该是一个包含每个字节的长 C 字符串(数组)(如果它们是文件的一部分,我们也不能忽略空字节)。我目前拥有的是:

   char *buff;
   int n = 0;
   char c;
   int count;

   if (ferror (stdin))
   {
      fprintf(stderr, "error reading file\n");
      exit (1);
   }
   else
   {
      do {   
         buff = (char*) realloc (buff, n+1);
         c = fgetc (stdin);
         buff[n] = c;
         if (c != EOF)
             n++;
     }
       while (c != EOF);
   }
   printf("characters entered: ");
   for (count = 0; count < n; count++)
       printf("%s ", buff[count]);
   free (buff);

它应该一直读取到文件末尾,每次都扩展内存但是当我尝试通过管道在一个简单的文本文件中运行它时,它告诉我我有一个分段错误。我不太确定我做错了什么。

请注意,我们被允许使用 malloc 和诸如此类的东西,但我看不出如何使它工作,因为我们知道需要多少内存。

4

4 回答 4

3

您在第一次调用 realloc 时使用了未分配的指针 buf。改成

char *buf = malloc(100);

以避免这个问题。

一旦你让它工作,你会注意到你的程序效率很低,每个字符都有一个 realloc。考虑在更大的块中重新分配以减少重新分配的数量。

于 2012-05-08T02:35:15.837 回答
3
char* buff;
...
buff = (char*) realloc (buff, n+1);

您正在尝试重新分配一个未初始化的指针,这会导致未定义的行为。改成

char* buff = 0;
...
buff = (char*) realloc (buff, n+1);

但正如已经指出的那样,这是非常低效的。

于 2012-05-08T02:35:42.227 回答
2

似乎@dasblinkenlight 和@smocking 的答案是当前原因,但为了避免下一次崩溃:

  1. 更改char c;int c;,因为 EOF 由多个字符表示。
  2. 一次为一个字符调用 realloc 是个坏主意,而是每次增加 X 字节的大小(比如说 100),这样会更有效率。
  3. 您需要在缓冲区的末尾添加空终止符('\0'),否则 - 未定义的行为在printf().
于 2012-05-08T02:33:52.690 回答
0

这是我想出的读stdin入 a char[]or char*(当嵌入NULLs in 时stdin):

char* content = NULL;
char c;
int contentSize = 0;

while ((c = fgetc(stdin)) != EOF){
    contentSize++;
    content = (char*)(realloc(content, contentSize+1));
    if (content == NULL) {
        perror("Realloc failed.");
        exit(2);
    }
    content[contentSize] = c;
}

for (int i = 0; i < contentSize; ++i) {
    printf("%c",content[i]);
}
于 2013-10-12T14:03:58.150 回答