C realloc错误

时间:2014-12-14 06:53:32

标签: c realloc

我在使用realloc打开内存时遇到问题。我正在尝试为从文件中读入的字符串数组动态分配内存。我想要做的是,使用fgets读取一行的前200个字符,如果那200个字符有新行,我继续下一行。我有这个工作很好,花花公子。我的问题是当前200个字符没有新行字符时,我试图将另外200个字符空间重新分配给字符串,然后将新的200个连接到旧字符串,直到它包含一个新行。经过测试,似乎在第二个realloc上,存在无效大小的glibc错误。

我称realloc错了吗?我已经阅读了手册页并将其用作参考,我用于参考的书说,因为它是sizeof(char),所以我不需要实际包含大小。谁能指出我哪里出错?我非常感谢你的帮助。

while( (!feof(file)) && lineCount < 11999 ) {               //will loop til end of file
    lines[index] = malloc(201*sizeof(char));                //give 201 spaces for the pointer at index
    fgets(lines[index], 200, file);                         //gets first 200 chars
    temp = strchr(lines[index], '\n');                     //set temp for while loop
       while(temp == NULL){                                //while the string doesnt have \n
           printf("string doesn't have have a newline character\n");
           lines[index]=realloc(lines[index],200);             //lines[index] now has 200 extra space
           printf("added extra space\n");
           fgets(temp2,200,file);                                  //read next 200 chars into temp
           printf("%s",temp2);                                     //for testing print next 200 lines
           temp=strchr(temp2,'\n');                            //for while loop, check if temp has "\n"
           strcat(lines[index],temp2);                              //concat string onto end
           printf("This is lines after cat\n\n\n%s",lines[index]); //testing print


  }//variables are iterated here
}

再次感谢您的时间和帮助。

编辑:在下面回答

1 个答案:

答案 0 :(得分:2)

转移评论以回答。

realloc()的大小参数是新的总大小,而不是大小的增量或减量。 因此,当您反复拨打realloc(lines[index], 200)时,您不会增加空间。

另请注意使用方法:

pointer = realloc(pointer, new_size);

很危险,因为如果realloc()失败,你就会丢失指向以前分配的内存的指针,从而泄漏内存。虽然它是详细的,你应该使用:

void *new_space = realloc(pointer, new_size);
if (new_space == 0)
    …handle error…
pointer = new_space;

操作代码

请注意,我已选择INC_SIZEMAX_LINES以便于测试(30个字符比200个更容易; 5个线条比12,000个容易)。还要注意,代码在成功读取数据后立即回复其输入;这有助于调试代码。它还将字符串括在尖括号中,以便更容易知道字符串末尾的位置。这有时可以揭示诸如Unix机器上的CRLF(DOS)行结尾等问题。

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

enum { INC_SIZE = 30 };
enum { MAX_LINE = 5  };

int main(void)
{
    char *lines[MAX_LINE] = { 0 };
    int lineCount = 0;

    for (lineCount = 0; lineCount < MAX_LINE; lineCount++)
    {
        size_t lineSize = INC_SIZE;
        lines[lineCount] = malloc(lineSize * sizeof(char));
        if (lines[lineCount] == 0)
            break;
        if (fgets(lines[lineCount], INC_SIZE, stdin) == NULL)
            break;
        printf("In-1 <<%s>>\n", lines[lineCount]);
        char *temp = strchr(lines[lineCount], '\n');
        while (temp == NULL)
        {
            printf("string doesn't have have a newline character\n");
            size_t newSize = lineSize + INC_SIZE;
            void *newSpace = realloc(lines[lineCount], newSize);
            if (newSpace == NULL)
                break;
            lines[lineCount] = newSpace;
            lineSize = newSize;
            printf("added extra space\n");
            char temp2[INC_SIZE];
            if (fgets(temp2, INC_SIZE, stdin) == NULL)
                break;
            printf("In-2 <<%s>>\n", temp2);
            temp = strchr(temp2, '\n');
            strcat(lines[lineCount], temp2);
            printf("This is the line after cat: <<%s>>\n", lines[lineCount]);
        }
    }
    for (int i = 0; i < lineCount; i++)
        printf("Line: <<%s>>\n", lines[i]);
    for (int i = 0; i < lineCount; i++)
        free(lines[i]);
    return 0;
}