【问题标题】:Realloc inside a function - corrupted size vs. prev_size函数内的 Realloc - 损坏的大小与 prev_size
【发布时间】:2019-05-23 03:05:44
【问题描述】:

我已决定学习 C 和 C++,但我为一个简单的任务而苦苦挣扎,无法理解它。非常感谢您的帮助。

在我的一个函数中,我创建了一个指针 *linesLenght,然后我调用了另一个函数来分配内存并填充数组。在其中一个函数中,会发生 1-3 次的重新分配。第一次一切顺利。但是在第二次尝试重新分配时,我得到一个损坏的大小与 prev_size 错误。

代码:

第一。功能

char * wordWrap (int width, const char * src ){
ulong len = strlen(src);
ulong lines = getLines(width,len);
int * linesLenght = getLinesLen(&lines, src, len, width);
... }

第二个功能

int * getLinesLen(ulong * lines, const char * src, ulong srcLen, int maxLine){
    int * linesLen = malloc((*lines) * sizeof(int));
    ulong counter = 0;

    for(int i = 0; i < srcLen; i++)
    {
            ///other hidden logic....
            if(counter == *lines)
            {
                printf("out! Must resize\n");
                resizeLinesArr(counter + 1, &linesLen);
                *lines += 1;
            }
    }
    *lines = counter;
    return linesLen;
}

第三个功能(这里我得到了错误)

void resizeLinesArr(ulong arrLen, int ** arr)
{
    int * tmp = realloc(*arr, arrLen * sizeof(int));

    if(tmp == NULL)
    {
        printf("realloc problem\n");
        free(*arr);
        exit(1);
    }
    else
    {
        *arr = tmp;
    }
}

【问题讨论】:

  • 你能提供更多关于你得到的确切错误的信息吗?
  • 退出代码 134(被信号 6:SIGABRT 中断)////// *** `/home/stepnlub/....' 中的错误:损坏的大小与 prev_size:0x00000000024db300 * **
  • 也许你正在用一个野指针破坏堆?
  • 这是什么意思?
  • 您在此处未显示的某些代码中写入了已分配缓冲区的边界,可能在“其他隐藏逻辑”中

标签: c memory memory-management realloc


【解决方案1】:

这个错误:

corrupted size vs. prev_size

是 malloc(或 realloc)在其内部记录保存变量已损坏时打印的错误。问题几乎肯定不在调用 realloc 的那一行。在某些时候,您可以:

  1. 在堆分配缓冲区的末尾或开头之前写入。
  2. free()之后继续使用指针。

这类事情通常很难追踪。我建议你尝试使用 valgrind 运行程序。首先,将-g 添加到您传递给编译器的选项列表中。这会打开调试信息,让 Valgrind 为您提供行号,而不仅仅是函数名。

然后像这样运行你的程序:

valgrind ./your_program

Valgrind 会查看每个内存访问,并检查它是否违反了我上面描述的两条规则。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 2021-08-20
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    相关资源
    最近更新 更多