C: 被释放的 malloc 错误指针未被分配

Posted

技术标签:

【中文标题】C: 被释放的 malloc 错误指针未被分配【英文标题】:C: malloc error-pointer being freed was not allocated 【发布时间】:2015-10-01 20:50:56 【问题描述】:

我试图从一个函数返回一个字符串数组,然后释放它使用的内存。代码如下:

int main(int argc, const char * argv[])

    for (int m = 0; m < 10000; m++) 
        char **data = dataTest();

        int i = 0;
        while(data[i]) 
            printf("%p ",data[i]);
            free(data[i]);
            i++;
        
        printf(" address= %p.\n",data);
        free(data);
    

    return 0;

函数如下:

char **dataTest()

    char *row[] = "this", "is", "a", "data", "string", NULL;
    char **str = row;
    char **dataReturn = (char **) malloc(sizeof(char *) * 6);

    int i = 0;
    while (*str) 
        dataReturn[i] = malloc(sizeof(char) * strlen(*str));
        strcpy(dataReturn[i++], *str);
        str++;
    

    return dataReturn;

一开始运行良好,但很快就出现错误。下面是结果。地址以某种方式出错并发生 malloc 错误。有人遇到过同样的问题吗?

0x100300030 0x100300040 0x100300050 0x100300060 0x100300070 地址= 0x100300000。 0x100300030 0x100300040 0x100300050 0x100300060 0x100300070 地址= 0x100300000。 0x100400030 0x100300030 0x100300040 0x100300050 0x100300060 地址= 0x100400000。 testC(562,0x7fff73e71310) malloc: *** 对象 0x3000000000000 错误: 被释放的指针未被分配 *** 在 malloc_error_break 中设置断点进行调试 0x100300060 0x100300070 0x100300030 0x100300040 0x100300050 0x3000000000000 程序以退出代码结束:9

【问题讨论】:

请see why not to castmalloc()C中的family返回值。 我想你只是忘了在strlen 的结果中添加一个空终止符。顺便说一句,sizeof(char) 总是不必要的,因为它的定义是 1。 printf(" address= %p.\n",data); 应该是 printf(" address= %p.\n",(void *)data);。这是您实际上应该 投射指针的少数情况之一。正如其他人所说:char ** malloc(sizeof(char *) * 6); 应该是:malloc( sizeof *dataReturn * 6);。无论如何,它更容易阅读和理解 为了完整说明为什么printf("%p", (void *) data) 需要强制转换,请引用标准:(C11, 7.21.6.1p8 格式化输入/输出函数) "p 参数应为指向 void 的指针。”。简而言之:不将void * 传递给printf 这是UB 【参考方案1】:

您需要在 dataTest 函数中将其添加到 return dataReturn; 之前:

dataReturn[i] = NULL ;

否则您的while (data[i]) 将继续超出预期。

而不是:

dataReturn[i] = malloc( sizeof(char) * (strlen(*str)) );

写:

dataReturn[i] = malloc(strlen(*str) + 1);

为了给终止的零分配空间。

顺便说一句,sizeof (char) 始终为 1。

【讨论】:

我认为您的意思是while(data[i])(在free() 循环中)而不是while (*str) 谢谢,现在可以正常使用了。这真的很有帮助!~ @ButterLover 如果对您有用,请随时accept this answer。

以上是关于C: 被释放的 malloc 错误指针未被分配的主要内容,如果未能解决你的问题,请参考以下文章

C++ 使用 getline() 打印:被释放的指针未在 XCode 中分配

指针 分配空间

malloc:***对象0x165060的错误:未释放指针被释放?

在 C 中释放 NULL 指针是一种好习惯吗? [复制]

未分配被释放的指针。复杂 malloc 历史帮助

malloc内存分配