鱼C论坛

 找回密码
 立即注册
查看: 1194|回复: 10

[已解决]请教指针问题

[复制链接]
发表于 2020-7-30 22:14:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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-31 11:35:38
下图来自于《C Primer Plus 第6版中文版》P63, P64, P82

2020-07-31_111959.png

2020-07-31_112018.png

2020-07-31_112031.png


P82.png

个人的建议是,没必要纠结它是什么,因为这个结果C标准中没有规定,
具体出现什么情况全看编译器和环境的心情,深究起来意义不大。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-7-30 22:27:00 | 显示全部楼层
随机的,读了一块乱七八糟的内存。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-30 22:32:05 | 显示全部楼层
本帖最后由 风过无痕1989 于 2020-7-30 22:34 编辑
永恒的蓝色梦想 发表于 2020-7-30 22:27
随机的,读了一块乱七八糟的内存。


不是,我更改输入 a , b 的数值,增加其他的语句(想在编译时改变内存的单元地址),2367460 这个数字始终没有改变
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

然而这就是一块乱七八糟的内存。
前面加个
  1. printf("%d%d%d%d", 1, 2, 3, 4);
复制代码
看看变没变?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-30 23:22:04 | 显示全部楼层
还是没变


                               
登录/注册后可看大图


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-31 11:35:38 | 显示全部楼层    本楼为最佳答案   
下图来自于《C Primer Plus 第6版中文版》P63, P64, P82

2020-07-31_111959.png

2020-07-31_112018.png

2020-07-31_112031.png


P82.png

个人的建议是,没必要纠结它是什么,因为这个结果C标准中没有规定,
具体出现什么情况全看编译器和环境的心情,深究起来意义不大。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-31 11:54:27 | 显示全部楼层
printf  的定义为: __cdecl printf(const char *, ...);
__cdecl 规则是参数先右后左传递,
先入栈的是函数返回地址,然后是右边第一个参数,等等
因为你少传一个参数,它应该是取得函数返回地址。
可以取得函数返回地址并输出试试。

long returnAddress = 0;

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

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

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

如果输出跟前面一致,则证明了我的猜测。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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 不相等
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-31 13:59:31 | 显示全部楼层
可以去研究一下C语言中可变参数个数的函数取参数的方式。

但不管怎么样,参数是从栈中读取出来的,只要不对栈进行写操作,就不会破坏栈,程序能正常运行。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-31 14:11:11 | 显示全部楼层
xieglt 发表于 2020-7-31 13:59
可以去研究一下C语言中可变参数个数的函数取参数的方式。

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

再等等看,看还有没有其他的高手,能很好地解释这个问题,若没有的话,也只能采纳楼上朋友的建议,不去纽结这个问题,编程序时注意这个问题就是了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-1 14:38:08 | 显示全部楼层
顶上去看看,还有没有别的、更好的解释
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-8-10 04:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表