不能理解这些用C语言编写的程序

时间:2018-01-25 12:38:33

标签: c pointers

请考虑以下代码:

1: #include <stdio.h>
2: int poin(int p[4]){
3:    printf("%u\n", p[0]);
4:    printf("%u\n", p[1]);
5:    printf("%u\n", p[2]);
6:    printf("%u\n", p[3]);
7:
8: }
9: int main(){
10:     int *p[4],a=1,b=2,c=3,d=4;
11:
12:    p[1]=&b;
13:    p[2]=&c;
14:    p[3]=&d;
15:    p[0]=&a;
16:    poin(*p);
17:    return 0;
18:}

显示此输出:

1
2686716
2686712
2686708

Process returned 0 (0x0)   execution time : 0.078 s
Press any key to continue.

让我们修改第14行和第14行中的程序。 15,看看修改后的代码:

1: #include <stdio.h>
2: int poin(int p[4]){
3: printf("%u\n", p[0]);
4: printf("%u\n", p[1]);
5: printf("%u\n", p[2]);
6: printf("%u\n", p[3]);
7:
8:}
9: int main(){
10: int *p[4],a=1,b=2,c=3,d=4;
11:
12:     p[1]=&b;
13:     p[2]=&c;
14:     p[3]=&a;
15:     p[0]=&d;
16:     poin(*p);
17:     return 0;
18:     }

它显示以下输出:

4
3
2
1

Process returned 0 (0x0)   execution time : 0.062 s
Press any key to continue.

请解释我为什么以及如何发生这些输出我很困惑而且无法理解程序

1 个答案:

答案 0 :(得分:1)

这两个程序都有未定义的行为,因为未指定编译器如何(以何种顺序)将变量与自动存储持续时间放在内存中。

但是,例如在第二个程序中获得的结果可以用以下方式解释。

编译器似乎按顺序放置变量a,b,c,d

d, c, b, a

没有记忆空白。

因此,具有类型p的函数参数int *指向变量d,输出d之后的所有变量。

考虑到这些陈述

12:     p[1]=&b;
13:     p[2]=&c;
14:     p[3]=&a;

甚至是多余的,因为该功能无法访问p[1]p[2]p[3]

就足够了
15:     p[0]=&d;

该函数不处理数组。它处理指向变量d的指针。

为了使这更清楚,只需按以下方式运行第二个程序

 poin(&d);

没有数组元素的初始化。

正确的程序可能看起来像

1: #include <stdio.h>
2: int poin(int **p ){
3: printf("%u\n", *p[0]);
4: printf("%u\n", *p[1]);
5: printf("%u\n", *p[2]);
6: printf("%u\n", *p[3]);
7:
8:}
9: int main( void ){
10: int *p[4],a=1,b=2,c=3,d=4;
11:
12:     p[1]=&b;
13:     p[2]=&c;
14:     p[3]=&a;
15:     p[0]=&d;
16:     poin(p);
17:     return 0;
18:     }