引发奇想的一个C语言程序

作者在 2011-04-22 22:57:13 发布以下内容
在某论坛看到的,
void f();
int main()
{
   int a = 0;
   f();
   printf("a = %d\n",a);
    return 0;
}
void f()//一个没有参数,没有返回值的函数
{
......//填写代码 要求执行后输出 "a = 10"

      //如何解答?f()应该是什么?

}
 
 

经过一点思考,自己写出一个实现,如下:

void f()
{
        *((int *)main-476403)=10;
}
 上述代码在Code::Blocks下编绎通过,感到很开心,哪知放在C-free环境下,结果却不一样,

于是改成:

void f()
{
    *((int *)main-476383)=10;
}
 在C-free中就可以通过,但在C::B中又得不到预期结果了。

求大虾的解释!!!为什么两个环境下main到a的字节偏移量不同???


默认分类 | 阅读 2329 次
文章评论,共12条
中加
2011-04-24 14:02
1
C::B这种表达形式是C++语言么?我怎么在C语言里没有见过额<img src="image/face/8.gif" class="face">
尤慕思(作者)
2011-04-24 22:38
2
<div class="quote"><span class="q"><b>中加</b>: C::B这种表达形式是C++语言么?我怎么在C语言里没有见过额<img src="image/face/8.gif" class="face"></span></div>哦,抱歉,C::B是Code::Blocks的简称,<br />
它是一种C\C++编绎器,用着手感不错的<img src="image/face/1.gif" class="face">,<br />
朋友们用过的都说它好<img src="image/face/2.gif" class="face">
ningjinyong2
2011-04-29 00:24
3
这也能改变<img src="image/face/19.gif" class="face">,a的存储空间是系统分配的,通过你这种方式,能找到a的存储空间,并改变存储空间的值?不解啊。难道是巧合?
尤慕思(作者)
2011-04-29 17:41
4
<div class="quote"><span class="q"><b>ningjinyong2</b>: 这也能改变<img src="image/face/19.gif" class="face">,a的存储空间是系统分配的,通过你这种方式,能找到a的存储空间,并改变存储空间的值?不解啊。难道是巧合?</span></div>我是这样想的,先编程序得到main和a的地址,然后算出他们俩的地址偏移量,<br />
在f()函数中通过main和那个偏移量,解引用来改变a的值,但是在两个不同的编绎器中得到的偏移量是不同的,这就难办了.(原本以为main和a的地址的差是一个常量<img src="image/face/2.gif" class="face">)
ningjinyong2
2011-04-29 20:50
5
我试过了C_Free,VC++,都内存出错了.<img src="image/face/11.gif" class="face">,这是你突发想到的啊,还是有根据的啊。
尤慕思(作者)
2011-04-29 21:03
6
<div class="quote"><span class="q"><b>ningjinyong2</b>: 我试过了C_Free,VC++,都内存出错了.<img src="image/face/11.gif" class="face">,这是你突发想到的啊,还是有根据的啊。</span></div>你瞧本文的名字就晓得了,C-free下用第二个函数也会错吗?<br />
不会吧??
philia
2011-04-30 13:12
7
虽然哥很菜,但···内存不是自动分配的吗?要先看看地址在哪儿的吧<img src="image/face/24.gif" class="face">
尤慕思(作者)
2011-04-30 21:36
8
<div class="quote"><span class="q"><b>philia</b>: 虽然哥很菜,但···内存不是自动分配的吗?要先看看地址在哪儿的吧<img src="image/face/24.gif" class="face"></span></div>是自动分配的不假,<br />
但对于一个整体,例如人,他两个眼睛的距离是不变的,<br />
所以我猜想,main和a的“距离”就该也是不变的,后来证明这种猜想是错的<br />
<br />
还有,哥才是哥,你怎会是哥呢——除非你是“下一个传说”?
lintaoyn
2011-05-03 18:47
9
void fun()<br />
{<br />
&nbsp; &nbsp; &nbsp; &nbsp; printf(&quot;a = 10&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; exit(0);<br />
}
尤慕思(作者)
2011-05-03 21:16
10
<div class="quote"><span class="q"><b>lintaoyn</b>: void fun()<br />
{<br />
&nbsp; &nbsp; &nbsp; &nbsp; printf(&quot;a = 10&quot;);<br />
&nbsp; &nbsp; &nbsp; &nbsp; exit(0);<br />
}</span></div>你笑死我了,妈呀太有创意了!!<img src="image/face/16.gif" class="face">
_eagle_ice
2011-05-05 09:04
11
一个函数的运行都是在栈中进行的。 你可以打印出入口地址和a的地址看一下,在不同的编译器中,试试看。。。
尤慕思(作者)
2011-05-06 21:25
12
<div class="quote"><span class="q"><b>_eagle_ice</b>: 一个函数的运行都是在栈中进行的。 你可以打印出入口地址和a的地址看一下,在不同的编译器中,试试看。。。</span></div>我意识到自己错了,<br />
不过现在自己对指针的理解又深了一些,<br />
想当然的做一些事其实也能得到不错的启发的<img src="image/face/2.gif" class="face">
游客请输入验证码
浏览71477次
最新评论