char*数组中的元素在复制到新数组时损坏
我以前遇到过这个问题,答案是要么为null终止字符串,要么确保为字符串分配足够的内存。以下是相关的代码片段:char*数组中的元素在复制到新数组时损坏,c,arrays,char,allocation,C,Arrays,Char,Allocation,我以前遇到过这个问题,答案是要么为null终止字符串,要么确保为字符串分配足够的内存。以下是相关的代码片段: for (z; z<mountable_volumes; z++) { main_items[z] = malloc(strlen(volumes[z])+2); main_items[z] = volumes[z]; printf("main_items[%i]: %s\n", z, volumes[z]); } main_items[z] = NULL; return main
for (z; z<mountable_volumes; z++)
{
main_items[z] = malloc(strlen(volumes[z])+2);
main_items[z] = volumes[z];
printf("main_items[%i]: %s\n", z, volumes[z]);
}
main_items[z] = NULL;
return main_items;
我错过了什么?谢谢如果需要,我可以粘贴更多的函数
编辑:
下面是整个函数:(我已经应用了strndup()和free()技巧)
谢谢大家
主要项目[z]=卷[z]代码>应为strcpy(主要项目[z],卷[z])
,否则您在上面一行上分配的内存会泄漏,指针main_items[z]
会与volumes[z]
main_items[z]=volumes[z]中的指针产生别名代码>应为strcpy(主要项目[z],卷[z])
,否则您在上面一行上分配的内存会泄漏,指针main_items[z]
会与volumes[z]
中的指针混叠。要复制字符串,您需要使用strcpy()
。作业不起作用
strcpy(main_items[z], volumes[z]);
而且,
main_items[z] = malloc(strlen(volumes[z])+2);
应该是
main_items[z] = (char *) malloc(strlen(volumes[z]) + 1);
我假设main_items[z]
和volumes[z]
是一个char*
要复制字符串,需要使用strcpy()
。作业不起作用
strcpy(main_items[z], volumes[z]);
而且,
main_items[z] = malloc(strlen(volumes[z])+2);
应该是
main_items[z] = (char *) malloc(strlen(volumes[z]) + 1);
我假设main_items[z]
和volumes[z]
是一个char*
作为每个人的strcpy()
示例的替代,您可以使用strdup()
,跳过malloc()
:
显然,您仍然必须释放()
内存!这还依赖于卷[z]
以NULL结尾
编辑:或者,正如Peter Downs在评论中指出的那样,如果您知道字符串的长度,您可以使用strndup()
,而不依赖空终止。作为每个人的strcpy()
示例的替代,您可以使用strdup()
,并跳过malloc()
:
显然,您仍然必须释放()
内存!这还依赖于卷[z]
以NULL结尾
编辑:或者,正如Peter Downs在评论中指出的那样,如果您知道字符串的长度,您可以使用strndup()
而不依赖空终止。主要\u项的类型是什么<代码>主要_项目[z]=卷[z]
似乎不正确,您应该使用strncpy
。无法分配数组。请至少查看主\u项和卷的声明。已发布整个函数。main_items是由get_mount_menu_options()创建的程序中其他地方声明的字符**(我发布的函数):char**main_items=get_mount_menu_options();主要项目的类型是什么<代码>主要_项目[z]=卷[z]
似乎不正确,您应该使用strncpy
。无法分配数组。请至少查看主\u项和卷的声明。已发布整个函数。main_items是由get_mount_menu_options()创建的程序中其他地方声明的字符**(我发布的函数):char**main_items=get_mount_menu_options();或者strndup
如果你知道长度。我可以得到我字符串的长度,我会尝试strndup谢谢。或者strndup
如果你知道长度。我可以得到我字符串的长度,我会尝试strndup谢谢。我编辑了原始问题以包括strndup和免费提示。我还添加了整个函数,反正也不是很长:)@raidzero您可能在sprintf(卷[mountable\u volumes],%s%s],操作,v->mount\u point)中有问题代码>:您确定v->mount_point
以空结尾吗?我假设是这样,因为打印时它显示正确,但我将尝试在它的结尾添加空结尾,因为问题显然不在循环的底部:)我在v->mount_point中添加了空结尾:strcat(v->mount_point,“\0”)代码>但结果是same@raidzero您正在调用volumes[mountable_volumes]=malloc(sizeof(char*)代码>这是不正确的:它分配了足够的空间来存储指向char的指针,而不是存储整个字符串!它应该是strlen(操作)+strlen(v->mount_point)+2
而不是sizeof(char*)
。我还添加了整个函数,反正也不是很长:)@raidzero您可能在sprintf(卷[mountable\u volumes],%s%s],操作,v->mount\u point)中有问题代码>:您确定v->mount_point
以空结尾吗?我假设是这样,因为打印时它显示正确,但我将尝试在它的结尾添加空结尾,因为问题显然不在循环的底部:)我在v->mount_point中添加了空结尾:strcat(v->mount_point,“\0”)代码>但结果是same@raidzero您正在调用volumes[mountable_volumes]=malloc(sizeof(char*)代码>这是不正确的:它分配了足够的空间来存储指向char的指针,而不是存储整个字符串!它应该是strlen(操作)+strlen(v->mount_point)+2
,而不是sizeof(char*)
。
main_items[z] = strdup(volumes[z]);