我正在解析大量数据,并使用 C 来解析。它适用于几乎所有数据,但在某一时刻我收到错误:
*** glibc detected *** ./a.out: free(): invalid next size (fast): 0x091fb288 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x75ee2)[0xb75d1ee2]
./a.out[0x8049321]
./a.out[0x80494b3]
./a.out[0x804b843]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xb75754d3]
我的代码如下。条件位于一个循环中,该循环成功地迭代了多次迭代,但在某一时刻抛出了错误。我的错误发生在 free(tmp); 时被调用,但是,tmp 仅在代码的这一小区域中使用。
...
if(tokens_o[i].start != tokens_o[i].end)
{
tmp = printToken(content, &tokens_o[i]);
printf("%s \n", tmp);
free(tmp);
}
...
char *
printToken(char *text, jsmntok_t *token)
{
int size = token->end - token->start;
char *text_token = calloc(size+1, sizeof(char));
if(text_token == NULL)
{
printf("error when reading token \n");
exit(0);
}
strncpy(text_token, text+token->start, size);
return text_token;
}
最佳答案
我预计在一次迭代中计算出的大小
为-1。这意味着将在 nmemb
设置为 0 的情况下调用 calloc
。
根据手册页,calloc
可以返回一个唯一的指针值,如果使用以下命令调用,该值稍后可以成功传递给 free
nmemb
为 0。
strncpy
被调用,大小为-1,但n的类型是size_t
(即无符号)因此,strncpy 将在任何分配的边界之外写入。
关于c - C 释放内存时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25046537/