C指针覆盖最后一个保存的指针
C pointer to pointer overwriting last one saved
我想做的是把字符串,保存到一个字符串数组中,然后根据索引修改每个副本。
我编辑了问题和代码,很乱,不清楚。由于问题几乎相同(我认为现在更精确),我想我可以在这里完全编辑它而无需创建新问题,但如果我必须做不同的事情,请告诉我。
问题(编辑):在阅读给出的答案、创建 MVCE、阅读 this 和一些调试技巧后,我觉得我做的一团糟使用指针和 strcpy... 为什么以下代码(编辑为 MVCE)给出此输出?
abc
x
x
y
它编译并且没有调试错误,但我希望代码将 line_ret 中字符串的第一个字符更改为 "x" 如果索引==0,并更改为 "y" 如果索引==1。
我读到 here 不可能更改指针指向的单个字符,但是如果我不知道我必须将 line_read 复制多少次到 line_ret 中怎么办,因此不知道声明数组的最大索引大小 line_ret?
代码(编辑):
#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;
}
如果您将地址(存储在指针中)复制到数组中的多个条目,但它们都指向同一块内存(即地址相同),那么使用该数组中的不同条目将始终导致同一块内存被覆盖
通过 comparing/printing 您存储在数组不同条目中的地址进行调试。该错误是两个数组条目包含相同地址的地方。
要修复,请确保数组中的条目接收不同的地址,即引用单独分配的内存块。
这意味着每次更改用于访问数组的索引时,您还需要 malloc 一块新内存以与不同的数组条目一起使用。
我想做的是把字符串,保存到一个字符串数组中,然后根据索引修改每个副本。
我编辑了问题和代码,很乱,不清楚。由于问题几乎相同(我认为现在更精确),我想我可以在这里完全编辑它而无需创建新问题,但如果我必须做不同的事情,请告诉我。
问题(编辑):在阅读给出的答案、创建 MVCE、阅读 this 和一些调试技巧后,我觉得我做的一团糟使用指针和 strcpy... 为什么以下代码(编辑为 MVCE)给出此输出?
abc
x
x
y
它编译并且没有调试错误,但我希望代码将 line_ret 中字符串的第一个字符更改为 "x" 如果索引==0,并更改为 "y" 如果索引==1。 我读到 here 不可能更改指针指向的单个字符,但是如果我不知道我必须将 line_read 复制多少次到 line_ret 中怎么办,因此不知道声明数组的最大索引大小 line_ret?
代码(编辑):
#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;
}
如果您将地址(存储在指针中)复制到数组中的多个条目,但它们都指向同一块内存(即地址相同),那么使用该数组中的不同条目将始终导致同一块内存被覆盖
通过 comparing/printing 您存储在数组不同条目中的地址进行调试。该错误是两个数组条目包含相同地址的地方。
要修复,请确保数组中的条目接收不同的地址,即引用单独分配的内存块。
这意味着每次更改用于访问数组的索引时,您还需要 malloc 一块新内存以与不同的数组条目一起使用。