风过无痕1989 发表于 2020-7-30 22:14:51

请教指针问题

#include<stdio.h>

int main()

{
   int a,b,c;
       int *pc = &c;
       int *pa = &a;
       int *pb = &b;
       scanf("%d,%d",&a,&b);
         *pc = *pa + *pb;
       printf("%d,%d\n",&a,&b);
       printf("%d,%d,%d\n",c,&c);
       return 0;
}

****************************************************
18 , 32
1245052 , 1245048
50 , 1245044 , 2367460
Press any key to continue . . . . . .

问题:由于不小心,输出时多打了一个 %d ,输出了一个 2367460 ,于是,我其上一行添加了一行:printf("%d,%d\n",&a,&b); 想看看是不是 &a 或者 &b ,结果不是。那么,这个 2367460 是什么玩艺?

永恒的蓝色梦想 发表于 2020-7-30 22:27:00

随机的,读了一块乱七八糟的内存。

风过无痕1989 发表于 2020-7-30 22:32:05

本帖最后由 风过无痕1989 于 2020-7-30 22:34 编辑

永恒的蓝色梦想 发表于 2020-7-30 22:27
随机的,读了一块乱七八糟的内存。

不是,我更改输入 a , b 的数值,增加其他的语句(想在编译时改变内存的单元地址),2367460 这个数字始终没有改变

永恒的蓝色梦想 发表于 2020-7-30 22:37:52

风过无痕1989 发表于 2020-7-30 22:32
不是,我更改输入 a , b 的数值,增加其他的语句(想在编译时改变内存的单元地址),2367460 这个数字始 ...

然而这就是一块乱七八糟的内存。
前面加个printf("%d%d%d%d", 1, 2, 3, 4);看看变没变?

风过无痕1989 发表于 2020-7-30 23:22:04

还是没变

https://xxx.ilovefishc.com/album/202007/30/232101ztv7jjf9qas8pr98.jpg

SHRS23 发表于 2020-7-31 11:35:38

下图来自于《C Primer Plus 第6版中文版》P63, P64, P82










个人的建议是,没必要纠结它是什么,因为这个结果C标准中没有规定,
具体出现什么情况全看编译器和环境的心情,深究起来意义不大。

xieglt 发表于 2020-7-31 11:54:27

printf的定义为: __cdecl printf(const char *, ...);
__cdecl 规则是参数先右后左传递,
先入栈的是函数返回地址,然后是右边第一个参数,等等
因为你少传一个参数,它应该是取得函数返回地址。
可以取得函数返回地址并输出试试。

long returnAddress = 0;

printf("%d,%d,%d\n",c,&c);

_asm
{
_returnAddress:
       LEAEAX,_returnAddress
      Mov returnAddress,EAX
}

printf("%d\n",returnAddress);
return 0;

如果输出跟前面一致,则证明了我的猜测。

风过无痕1989 发表于 2020-7-31 13:19:15

xieglt 发表于 2020-7-31 11:54
printf的定义为: __cdecl printf(const char *, ...);
__cdecl 规则是参数先右后左传递,
先入栈的是 ...

18 , 32
4198501
50 , 1245044 , 2367460
Press any key to continue . . .

值为 4198501,与我那个不知是什么玩艺的输出值 2367460 不相等

xieglt 发表于 2020-7-31 13:59:31

可以去研究一下C语言中可变参数个数的函数取参数的方式。

但不管怎么样,参数是从栈中读取出来的,只要不对栈进行写操作,就不会破坏栈,程序能正常运行。

风过无痕1989 发表于 2020-7-31 14:11:11

xieglt 发表于 2020-7-31 13:59
可以去研究一下C语言中可变参数个数的函数取参数的方式。

但不管怎么样,参数是从栈中读取出来的,只要 ...

再等等看,看还有没有其他的高手,能很好地解释这个问题,若没有的话,也只能采纳楼上朋友的建议,不去纽结这个问题,编程序时注意这个问题就是了

风过无痕1989 发表于 2020-8-1 14:38:08

顶上去看看,还有没有别的、更好的解释
页: [1]
查看完整版本: 请教指针问题