【发布时间】: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 cast
malloc()和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