请考虑以下代码:
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.
请解释我为什么以及如何发生这些输出我很困惑而且无法理解程序
答案 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: }