繁体   English   中英

混淆的结果:C 中的指针数组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM