我写了一小段代码来测试指针数组是否像我一样工作 预期。然后我得到了这个有线结果 - 在第三个指针赋值之后,指针数组都指向最后一个字符串。谁能解释发生了什么?谢谢。
#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
答案 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
是静态缓冲区的地址。