函数内部重新分配 - 损坏的大小与 prev_size

Lub*_*čka 1 c memory memory-management realloc

我决定学习 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);
... }
Run Code Online (Sandbox Code Playgroud)

第二功能

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;
}
Run Code Online (Sandbox Code Playgroud)

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Nic*_*ell 8

这个错误:

corrupted size vs. prev_size
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

valgrind ./your_program
Run Code Online (Sandbox Code Playgroud)

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