C指针覆盖最后保存的指针

时间:2018-07-03 22:35:17

标签: c pointers memcpy strcpy

我想要做的是获取字符串,将其保存到字符串数组中,然后根据索引修改每个副本。

我编辑了问题和代码,内容混乱且不清楚。由于问题几乎相同(我认为现在更精确了),我想我可以在这里完全编辑它而无需创建新问题,但是让我知道是否需要做不同的事情。

问题(编辑):阅读给出的答案,创建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;
}

1 个答案:

答案 0 :(得分:0)

如果将地址(存储在指针中)复制到数组中的多个条目,但是它们都指向同一块内存(即地址相同),则在该数组中使用不同的条目将始终导致相同的结果内存被覆盖。

通过比较/打印存储在阵列中不同条目中的地址进行调试。该错误是两个数组条目包含相同地址的地方。

要解决此问题,请确保数组中的条目接收不同的地址,即,指的是分别分配的内存。
这意味着每次更改用于访问数组的索引时,您还需要malloc分配一块新的内存,以与该不同的数组条目一起使用。