| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1834 人关注过本帖
标题:新手求助,实现自己的printf函数 内存分配问题
只看楼主 加入收藏
tixi
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2016-3-24
结帖率:0
收藏
已结贴  问题点数:20 回复次数:8 
新手求助,实现自己的printf函数 内存分配问题
代码
 int myprintf(int a,int b,int c)
{   //int *p = &a;
     printf("a = %d\n",&a);
     //p--;
     printf("b = %d\n",&b);
     //p--;
     printf("c = %d\n",&c);
}
int main(void)
{
     myprintf(200,300,400);
}
结果
a = 0x7ffcb24080ec
b = 0x7ffcb24080e8
c = 0x7ffcb24080e4

这个内存地址是由大到小分配的,
用指针p--也能输出a,b,c.
如果把函数定义为int myprintf(const char *format,...)
那地址就直接没有规律了
请问这个问题是电脑的原因吗?
我在网上找别人的源代码来编译却又是可以的
搜索更多相关主题的帖子: 照片 源代码 网上 
2016-03-26 22:28
hjx1120
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:李掌柜
等 级:贵宾
威 望:41
帖 子:1314
专家分:6927
注 册:2008-1-3
收藏
得分:10 
楼主知道const这个单词的中文是什么意思嘛
2016-03-27 01:35
tixi
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2016-3-24
收藏
得分:0 
回复 2楼 hjx1120
把变量定义为不可变的
好像是这样吧
2016-03-27 01:42
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你定義的函數根本不能達到標題所描述的目的,而裏面的問題更是與此無關。那個所謂的“順序”是參數在棧中的地址順序,你傳的是値參,就是那個3個常數在函數棧中的地址。

授人以渔,不授人以鱼。
2016-03-27 17:39
tixi
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2016-3-24
收藏
得分:0 
回复 4楼 TonyDeng
我是看着视频学的,上面的代码是用来介绍这个函数实现的算法.就是函数的多个传参的地址是连续分配的,对指针进行++就可以得到各个参数.可是我的这个就直接卡这里了.后来我就照抄视频最后的代码,用到了va_list和 va_start这两个函数.居然就行了.这让我很迷惑
2016-03-27 19:31
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
多看書,少看視頻。那些函數是用文字介紹的,不是看代碼可以看得到的。那兩個函數是幹什麽的你都不知道,光知道用了“可以”有什麽用。

授人以渔,不授人以鱼。
2016-03-27 19:35
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
要存取函數的參數,首先要獲得這個參數數組的內存入口地址,才能使用所謂的指針運算存取内容。你開始的代碼,衹是直接對各個參數變量取其地址,不是對函數的參數列表入口地址操作。(200,300,400)的形參是(a,b,c),&a實際上是100的地址,這3個値確實是依次壓入棧的,但並非所有實參都是你這樣用硬代碼寫入,所以得到的結果不同。事實上是不能用&參數名這種形式取參數地址的。

授人以渔,不授人以鱼。
2016-03-27 19:53
tixi
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2016-3-24
收藏
得分:0 
回复 7楼 TonyDeng
非常谢谢你的解答.肯定是因为我什么地方理解错了,才会遇到这样的问题.我还是多看看书吧.
2016-03-27 20:57
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
友情提醒一下,这种不定类型、可变数目的传参机制,漏洞多多,很不安全,少用为佳。C有这种机制,C++是明确不鼓励的(但仍然支持)。

授人以渔,不授人以鱼。
2016-03-27 22:25
快速回复:新手求助,实现自己的printf函数 内存分配问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016942 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved