gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:06:57 25 4
gpt4 key购买 nike

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

Volumes[] 是正确的,但是当它的内容被创建到 main_items[] 中时,它就变坏了。我试过玩 malloc,甚至直接分配比必要更多的内存。我还尝试在每个 main_items[] 元素的末尾添加一个 '\0'。我尝试使用 strcpy、strncpy、sprintf 得到相同的结果。

这是我程序的日志:

volumes[0]: Unmount /sdcard
volumes[1]: Mount /system
volumes[2]: Unmount /cache
volumes[3]: Mount /data
volumes[0]: Unmount /sdc)☻
main_items[1]: Mount /syste)☻
main_items[2]: Unmount /cac‼
main_items[3]: Mount /data

我错过了什么?谢谢!如果需要,我可以粘贴更多功能。

编辑:

这是整个函数:(我已经应用了 strndup() 和 free() 技巧)

char** get_mount_menu_options()
{
Volume * device_volumes = get_device_volumes();
num_volumes = get_num_volumes();

char** volumes = malloc (num_volumes * sizeof (char *));

int mountable_volumes = 0;
int usb_storage_enabled = is_usb_storage_enabled();

int i;
for (i=0; i<num_volumes; i++)
{
volumes[i] = "";
Volume *v = &device_volumes[i];
char* operation;
if (is_path_mountable(v->mount_point) != -1)
{
if (is_path_mounted(v->mount_point)) operation = "Unmount";
else operation = "Mount";
volumes[mountable_volumes] = malloc(sizeof(char*));
printf("volumes[%i]: %s %s\n", mountable_volumes, operation, v->mount_point);
sprintf(volumes[mountable_volumes], "%s %s", operation, v->mount_point);
mountable_volumes++;
}
}

char **main_items = malloc (num_volumes * sizeof (char *));

int z;
for (z=0; z<mountable_volumes; z++)
{
main_items[z] = strndup(volumes[z], strlen(volumes[z]));
free(volumes[z]);
printf("main_items[%i]: %s\n", z, volumes[z]);
}
main_items[z] = NULL;
return main_items;
}

当前日志:

volumes[0]: Unmount /sdcard
volumes[1]: Mount /system
volumes[2]: Unmount /cache
volumes[3]: Mount /data
main_items[0]: Unmount /sdc)☻
main_items[1]: Mount /syste)☻
main_items[2]: Unmount ¿♠
main_items[3]:

谢谢大家!

最佳答案

要复制字符串,您需要使用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 *

关于c - char* 数组中的元素在复制到新数组时损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8607585/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com