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

时间:2018-12-23 16:17:37

标签: c memory memory-management realloc

我已经决定学习C和C ++,但是Im正在为一个简单的任务而苦苦挣扎,无法解决这个问题。我真的很感谢您的帮助。

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

代码:

1st。功能

@Autowired
private AuthoringEventIT authoringEventIT;

@PostMapping()
public ResponseEntity<Event> authorEvent(@RequestBody final EventRequest request) {

    ProcessingResultEvent responseData = authoringEventIT.authoringEvent(request);

    return responseData.getProcessedData();
}

第二个功能

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

第3个功能(在出现错误的地方)

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;
}

1 个答案:

答案 0 :(得分:0)

此错误:

corrupted size vs. prev_size

是malloc(或重新分配)的内部记录保持变量已损坏时打印的错误。几乎可以肯定,问题不在调用realloc的行中。在某个时候,您要么:

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

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

然后像这样运行程序:

valgrind ./your_program

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