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 一块新内存以与不同的数组条目一起使用。