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 中分配