【问题标题】:How to realloc properly?如何正确重新分配?
【发布时间】:2016-03-11 03:20:53
【问题描述】:


我写了一个小函数来返回一个由给程序的输入生成的字符串,它工作正常,直到我用常量大小换取动态内存分配。
在我用一些 printf() 测试后,看起来程序在realloc() 被调用。
我是在 realloc() 上做错了什么,还是别的什么?

char* get_line()
{
    size_t ptr_pos = 0, size = 50;
    int c;
    char* line = malloc(size * sizeof *line);
    char* temp;

    while((c = getchar()) != EOF)
    {
        if(++ptr_pos >= size)
        {
            size += 50;
            temp = realloc(line, size * sizeof *line); // The program crashes on this intruction.

            if(temp != NULL)
            {
                line = temp;
                printf("Reallocation success.\n");
            }
            else
            {
                printf("Reallocation error.\n");
                free(line);
                exit(1);
            }
        }

        *line++ = c;
        if(c == '\n')
            break;
    }
    if(ptr_pos == 0)
        return NULL;
    *line = '\0';

    return line - ptr_pos;
}


感谢您的帮助。

【问题讨论】:

  • malloc()realloc() 返回 void *。您直接将它们用作char *。显式转换它们。
  • 您可能希望将*line++ = c; 替换为line[ptr_pos - 1] = c;
  • @Pawan:这不是必要的,在 C 中也不推荐。C 不是 C++。
  • @alk "你可能想用 line[ptr_pos - 1] = c; 替换 *line++ = c;" 。现在我已经阅读了 rici 的回答,我明白为什么这会抑制错误,好点。

标签: c memory-management realloc


【解决方案1】:

当你调用realloc时,你必须给它分配内存的开始地址,与malloc最初返回的地址相同。 free也是如此。

但是你正在修改line的值,所以在调用realloc时它不再指向块的开头。

这是未定义的行为,因此绝对可能出现段错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 2015-10-11
    • 2013-11-30
    • 2022-01-11
    • 2021-08-21
    相关资源
    最近更新 更多