gpt4 book ai didi

看不懂这些用C写的程序

转载 作者:行者123 更新时间:2023-11-30 21:36:33 24 4
gpt4 key购买 nike

考虑以下代码:

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行和第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.

请解释一下这些输出发生的原因和方式,我很困惑并且无法理解程序

最佳答案

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

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

看来编译器将变量a、b、c、d按顺序放置

d, c, b, a

没有内存间隙。

因此,类型为 int * 的函数参数 p 指向变量 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: }

关于看不懂这些用C写的程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48443097/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com