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)
这个错误:
corrupted size vs. prev_size
Run Code Online (Sandbox Code Playgroud)
是 malloc(或 realloc)在其内部记录保存变量已损坏时打印的错误。几乎可以肯定问题不在调用 realloc 的行中。在某些时候,您可以:
free()。这类事情通常很难追踪。我建议您尝试使用 valgrind 运行该程序。首先,添加-g到传递给编译器的选项列表中。这会打开调试信息,让 Valgrind 为您提供行号而不仅仅是函数名称。
然后像这样运行你的程序:
valgrind ./your_program
Run Code Online (Sandbox Code Playgroud)
Valgrind 会检查每次内存访问并检查它是否违反了我上面描述的两条规则。