c - C 释放内存时出错

标签 c memory-management memory-leaks

我正在解析大量数据,并使用 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/

相关文章:

c - 获得空闲时指向内存块的指针()不管指针是什么?

c - Valgrind 输出理解

java - 在 java restful api 中查找内存泄漏

c - 如何用C语言进行事件驱动的磁盘IO

c - 与 char *foo() 函数关联的内存是否被释放(在 C 中)?

ios - 通过导航 Controller 调用自定义加载方法

c++ - 列表中 double 和 float 对象的大小是否相等?

javascript - 我需要删除 dom 片段还是垃圾收集器会删除它们?

c - 复制文本文件并将其粘贴到新文件 C 时遇到问题

c - 错误 : invalid operands to binary == (have 'struct demo' and 'struct demo' )