为什么数组会被覆盖?

时间:2019-01-28 23:34:36

标签: c

我正在尝试找出代码中的错误,并且由于某种原因,在scanf()循环之后,数组看起来很奇怪。 这可能是什么原因?

我输入的输入是“ a”,“ b”,“ c”。 这是控制台的输出:

all element are: a
all element are: b
all element are: c
s: c
after loop1: c
after loop3: c

s_arr在循环完成后更改。

这是我的代码:

int main() {

    char s[5];
    char *s_arr[3];

    for(int i=0; i<3; i++){
        scanf("%s\n", s);
        s_arr[i] = s;
        printf("all element are: %s\n", s_arr[i]);
    }
    printf("s: %s\n", s);
    printf("after loop1: %s\n", s_arr[0]);
    printf("after loop3: %s\n", s_arr[2]);

    return 0;
}

1 个答案:

答案 0 :(得分:2)

您不会覆盖数组元素。但是,每个元素都是一个指针,并且使s_arr[0]s_arr[1]s_arr[2]中的每个都指向s中的字符串。

由于只有一个字符串,并且每个指针在循环后都指向相同的字符串,所以在打印出来时会得到相同的结果。

解决此问题的一种方法是将s_arr做成一个字符串数组(即二维char数组),然后将s复制到每个字符串中。

此外,对于字符串输入,请考虑fgets(),这样可以防止缓冲区溢出。