[英]Able to Print Expected Results From Uninitialized Array of Pointers to Structures - Confused
[英]Confused Results: Array of pointers in 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]);
}
程序中的 output 是:
morning
hello
good
good
good
good
您已将pstr[0]
、 pstr[1]
和pstr[2]
设置为等于p
。 最后写入p
的是字节序列"good"
。 所以最后,你实际上是打印了三遍p
。
pstr
数组中的所有三个指针都指向同一个 memory 位置 ( p
)。
由于您使用strcpy
调用多次修改了 memory 位置的内容,因此它将包含最后放置在那里的任何内容。
在这种情况下,字符串"good"
最后被放置在那里,所以这就是pstr
数组中所有三个指针所指向的内容,这就是将在循环中重复显示的内容。
基本点——p引用的p
数组一次只能包含一个字符串。
代码末尾的循环将始终在每次迭代中打印出相同的值,因为您使用相同的指针p
为数组pstr
中的每个条目播种。
如果您想在每次迭代中看到不同的结果,您必须将pstr[0]
、 pstr[1]
和pstr[2]
指向 memory 的不同区域。
pstr[0]、pstr[1] 和 pstr[2] 都指向同一个 10 字符数组 p。 当你复制每个字符串时,你改变了数组 p 的内容,但它的地址没有改变。 因此,在将最后一个字符串复制到 p 之后,您最终只会打印 3 次相同的内容。
不仅数组的所有条目都是 p,而且您正在使用strcpy
非零终止字符串。 strcpy()
需要将字符串以零结尾,否则您将获得缓冲区溢出并带来不可预知的后果。
很简单,你设置pstr[i]=p;
位p
是 static 缓冲区的地址。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.