realloc():下一个大小无效:0x00000000

时间:2014-07-29 23:53:27

标签: c realloc

寻找一些我一直试图解决的问题的建议。 程序从文本文件中读取,并根据文件中给出的命令进行一些格式化。它似乎适用于我尝试的每个文件,除了2,它们都相当大。 这是有问题的代码:

    /* initalize memory for output */
    output.data = (char**)calloc(1,sizeof(char*));

    /* initialize size of output */
    output.size = 0;

    /* iterate through the input, line by line */
    int i;
    for (i = 0; i < num_lines; i++)
    {
    /* if it is not a newline and if formatting is on */
    if (fmt)
    {
        /* allocate memory for a buffer to hold the line to be formatted */
        char *line_buffer = (char*)calloc(strlen(lines[i]) + 1, sizeof(char));

        if (line_buffer == NULL)
        {
            fprintf(stderr, "ERROR: Memory Allocation Failed\n");
            exit(1);
        }

        /* copy the unformatted line into the buffer and tokenize by whitespace */
        strcpy(line_buffer, lines[i]);
        char* word = strtok(line_buffer, " \n");

        /* while there is a word */
        while (word)
        {
            /* if the next word will go over allocated width */
            if (current_pos + strlen(word) + 1 > width)
            {
                /* make ze newline, increase output size */
                strcat(output.data[output.size], "\n");
                output.size++;
  ------->>>>>  output.data = (char**)realloc(output.data, sizeof(char*) * (output.size + 1));

使用gdb我已经发现错误是在箭头指向它的行上,唯一的问题是我无法弄清楚它为什么会发生。它只发生在正在格式化的文本文件很大(716行)时,它似乎发生在最后一次迭代(num_lines = 716)。任何想法都会非常感激。谢谢!

编辑:对不起的人,应该提到我对此很新!修正了一些错误。

1 个答案:

答案 0 :(得分:0)

最直接的问题是:

strncat(output.data[output.size], "\n", 2);

正如BLUEPIXY所指出的那样。目前output.data[output.size]是一个空指针 1 ,所以你不能strncat到它。

要解决此问题,您可以分配一些空间:

output.data[output.size] = malloc(2);
if ( NULL == output.data[output.size] )
     // error handling...

strcpy(output.data[output.size], "\n");

但是,可能还有另一种解决方案可以更好地适应您未显示的其余功能。 (大概你在某处存放空间来存储word)。

更新帖子并显示其余功能会很有帮助。还要确保发布确切的代码,因为(output.size + )无法编译。我想这是你在试图把那些大箭头放在你的线上时引入的拼写错误。

1 实际上它都是零位,这是普通系统上的空指针,但并不能保证对所有系统都是如此。