2011-07-11 35 views
1

我写了一小段代码来测试指针数组是否工作正如我想要的 。然后我得到了这个有线结果 - 在第三个指针分配后,指针数组都指向最后一个字符串。任何人都可以解释发生的事谢谢。困惑的结果:在C的指针阵列

#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 
+2

请确保您的字符串为null。 –

+0

U-la-la。我建议你一次尝试一个(!)。当这个工作时,你会转向下一个更困难的例子。我很头晕地看着这段代码,如果有人为你纠正它,你可能仍然很难理解....一步一步。 – AudioDroid

+0

也让你的主要回报int –

回答

1

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

5

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

2

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

由于您使用相同的指针p在数组pstr中播种了每个条目,因此代码末尾的循环始终会在每次迭代中打印出相同的值。

如果你想在每次迭代中看到不同的结果,你必须指向pstr[0],pstr[1]pstr[2]不同区域的内存。

1

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

3

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

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

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

1

不仅数组的所有条目都是p,而且您是strcpy'ng非空终止的字符串。 strcpy()需要这些字符串被终止,否则你会得到一个缓冲区溢出,并带来不可预知的后果。