请教指针问题
#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 是什么玩艺?
随机的,读了一块乱七八糟的内存。 本帖最后由 风过无痕1989 于 2020-7-30 22:34 编辑
永恒的蓝色梦想 发表于 2020-7-30 22:27
随机的,读了一块乱七八糟的内存。
不是,我更改输入 a , b 的数值,增加其他的语句(想在编译时改变内存的单元地址),2367460 这个数字始终没有改变 风过无痕1989 发表于 2020-7-30 22:32
不是,我更改输入 a , b 的数值,增加其他的语句(想在编译时改变内存的单元地址),2367460 这个数字始 ...
然而这就是一块乱七八糟的内存。
前面加个printf("%d%d%d%d", 1, 2, 3, 4);看看变没变? 还是没变
https://xxx.ilovefishc.com/album/202007/30/232101ztv7jjf9qas8pr98.jpg
下图来自于《C Primer Plus 第6版中文版》P63, P64, P82
个人的建议是,没必要纠结它是什么,因为这个结果C标准中没有规定,
具体出现什么情况全看编译器和环境的心情,深究起来意义不大。 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;
如果输出跟前面一致,则证明了我的猜测。
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 不相等 可以去研究一下C语言中可变参数个数的函数取参数的方式。
但不管怎么样,参数是从栈中读取出来的,只要不对栈进行写操作,就不会破坏栈,程序能正常运行。
xieglt 发表于 2020-7-31 13:59
可以去研究一下C语言中可变参数个数的函数取参数的方式。
但不管怎么样,参数是从栈中读取出来的,只要 ...
再等等看,看还有没有其他的高手,能很好地解释这个问题,若没有的话,也只能采纳楼上朋友的建议,不去纽结这个问题,编程序时注意这个问题就是了 顶上去看看,还有没有别的、更好的解释
页:
[1]