我想要做的是获取字符串,将其保存到字符串数组中,然后根据索引修改每个副本。
我编辑了问题和代码,内容混乱且不清楚。由于问题几乎相同(我认为现在更精确了),我想我可以在这里完全编辑它而无需创建新问题,但是让我知道是否需要做不同的事情。
问题(编辑):阅读给出的答案,创建MVCE,并阅读this和一些调试技巧之后,我认为我在使用指针和strcpy时一团糟。 ..为什么以下代码(编辑为MVCE)给出此输出?
abc
x
x
y
它可以编译并且没有调试错误,但是我希望代码将index_ = 0时line_ret中字符串的第一个字符更改为“ x”,如果index == 1则更改为“ y”。 我读过here,无法更改指针指向的字符,但是如果我不知道必须将line_read复制到line_ret多少次,从而不知道最大索引大小,该怎么办?声明数组line_ret?
代码(EDIT):
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
size_t len = 10;
int main(void){
char *line_read = malloc(5);
strcpy(line_read, "abc");
char **line_ret = malloc(5 * sizeof(char*));
int index = 0;
while(index < 2){
line_ret[index] = realloc(line_ret, 1*len);
memcpy(&line_ret[index], &line_read, len);
printf("%s\n", line_ret[index]);
if(index == 0){
strcpy(&line_ret[index][0], "x");
} else if(index == 1){
strcpy(&line_ret[index][0], "y");
}
printf("%s\n", line_ret[index]);
index++;
}
free(line_read);
free(line_ret);
return 0;
}
答案 0 :(得分:0)
如果将地址(存储在指针中)复制到数组中的多个条目,但是它们都指向同一块内存(即地址相同),则在该数组中使用不同的条目将始终导致相同的结果内存被覆盖。
通过比较/打印存储在阵列中不同条目中的地址进行调试。该错误是两个数组条目包含相同地址的地方。
要解决此问题,请确保数组中的条目接收不同的地址,即,指的是分别分配的内存。
这意味着每次更改用于访问数组的索引时,您还需要malloc分配一块新的内存,以与该不同的数组条目一起使用。