困惑的结果:C中的指针数组

时间:2011-07-11 15:53:40

标签: c arrays pointers

我写了一小段代码来测试指针数组是否像我一样工作 预期。然后我得到了这个有线结果 - 在第三个指针赋值之后,指针数组都指向最后一个字符串。谁能解释发生了什么?谢谢。

#include <string.h>
#include <stdio.h>

main() {

    char *pstr[10];
    char p[10];
    char *s1 = "morning";
    char s2[10] = {'h','e','l','l','o'};
    char s3[10] = {'g','o','o','d'};
    int i = 0; 

    strcpy(p, s1);
    pstr[0] = p;
    printf("%s\n", pstr[0]);

    strcpy(p, s2);  
    pstr[1] = p;
    printf("%s\n", pstr[1]);

    strcpy(p, s3);  
    pstr[2] = p;
    printf("%s\n", pstr[2]);

    for (i = 0; i < 3; i++)
        printf("%s\n", pstr[i]);
}

该计划的输出是:

morning
hello
good
good
good
good

6 个答案:

答案 0 :(得分:6)

您已将pstr[0]pstr[1]pstr[2]设为等于p。写入p的最后一件事是字节序列"good"。所以最后,你基本上打印p三次。

答案 1 :(得分:4)

pstr数组中的所有三个指针指向相同的内存位置(p)。

由于您使用strcpy调用几次修改了该内存位置的内容,因此它将包含最后放置的内容。

在这种情况下,字符串"good"最后放在那里,这就是pstr数组中所有三个指针都指向的内容,这就是循环中重复显示的内容。

答案 2 :(得分:3)

基本点 - p引用的内存数组一次只能包含一个字符串。

代码末尾的循环将始终在每次迭代时打印出相同的值,因为您使用相同的指针pstr对数组p中的每个条目进行了种子处理。

如果您希望在每次迭代时看到不同的结果,则必须将pstr[0]pstr[1]pstr[2]指向不同的内存区域。

答案 3 :(得分:2)

pstr [0],pstr [1]和pstr [2]都指向相同的10个字符的数组p。复制每个字符串时,更改数组p的内容,但它的地址不会更改。因此,在将最后一个字符串复制到p后,您最终会打印三次相同的内容。

答案 4 :(得分:2)

不仅数组的所有条目都是p,而且你是strcpy非零终止字符串。 strcpy()需要将字符串置零,否则会因缓冲区溢出而产生不可预测的后果。

答案 5 :(得分:1)

简单,你设置pstr[i]=p;p是静态缓冲区的地址。