Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
char*数组中的元素在复制到新数组时损坏_C_Arrays_Char_Allocation - Fatal编程技术网

char*数组中的元素在复制到新数组时损坏

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

我以前遇到过这个问题,答案是要么为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_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]);