一个非常简单的C程序的运行结果

CCCCCCCCCCCCCCC 2009-10-14 10:08:38
#include<stdio.h>
main()
{
int a,b,sum;
a=1;b=2;
sum=a+b;
printf("sum is %d\n");
}


结果是:2367460

为什么?
...全文
230 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
huer0625 2010-03-21
  • 打赏
  • 举报
回复
你也太抠了吧,一分都没有的帖子你也敢发。嘿。。。
算了,看在你刚才给我回答这个问题的份上。我给你解释一下这个随机值是怎么产生的吧。
想要理解这个问题,我们首先来考虑宁外一个问题。那就是,c言语怎样把参数吧。下面我给出例子吧。
main.c
void myprint(char *str, int length);
int main()
{
myprint("hello, the world!", 18);
return 0;
}

foo.asm
extern main
global _start
global myprint
sectio .text
_start:
call main
mov ebx, 0
mov eax, 1
int 0x80
myprint:
mov edx,[esp + 8]; length
mov ecx, [esp + 4]; str
mov ebx, 1
mov eax, 4 ;sys_write
int 0x80
ret

然后在linux中以下命令编译
nasm -f elf foo.asm
gcc -c main.c
ld -s main.o foo.asm
运行编译结果
./main
可以看到
hello, the world!
下次给你解释吧。宿舍熄灯了。嘿嘿,需要到我空间留言。
mymtom 2009-12-31
  • 打赏
  • 举报
回复
C调用才有可变参数

printf("sum is %d\n");
的栈, 由于%d指示后一个参数是整形, 调用时并没有传整数参数进去,
所以取到的整数是未知的。

--------------
| | 栈顶
--------------
| 0xMMMMMMMM | 最后一个参数也就是指向字符串 "sum is %d\n"的指针
--------------
| 0x00241FE4 | %d打印的就是这个数。也就是十进制2367460
-------------
| |
--------------
| 0xNNNNNNNN | 函数返回地址
-------------

printf("sum is %d\n", sum);
的栈, 由于%d指示后一个参数是整形, 调用时并传了整数参数sum进去,
所以取到的整数就是sum=3.
--------------
| | 栈顶
--------------
| 0xMMMMMMMM | 最后一个参数也就是指向字符串 "sum is %d\n"的指针
--------------
| 0x00000003 | sum %d打印的sum。
--------------
| |
-------------
| |
--------------
| 0xNNNNNNNN | 函数返回地址
-------------
hntoitx 2009-12-17
  • 打赏
  • 举报
回复
printf("sum is %d\n");
|
这里有一个%d就说明且一个数值要进行格式化到字符串里面,但你没有传第二个参数.而在这个函数里面没有接收到数据进行赋值造成的.

例:

void printf( char* p, ... )
{
//检测"sum is %d\n"字符串是否需要进行格式化. (不进行写实际代码)
//有%d 进行数值格式化.
//int data; 这个data值是由stack弹出来的,所以相当于一个没有赋初始值的数据.
//将data格式化到字符串里面.
//进行输出


}
java_xiaoxiao 2009-12-17
  • 打赏
  • 举报
回复
这是系统里存在的数,大概要把sum初始化。
Garfield 2009-10-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 mstlq 的回复:]
引用 8 楼 garfield 的回复:
实际上它print的是字符串常量指针后面的一个4byte的内存吧。。

是从stack那里pop出来的一个4byte的东西……
[/Quote]

呃,我说的后面是阅读顺序,然后内存的确是取stack。。是push的字符串前stack顶的内容,是这个意思。
按照脑子里的说了,没表达清楚。
不过它不是pop出来的,是根据EBP算出来的,哈~
mstlq 2009-10-15
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 garfield 的回复:]
实际上它print的是字符串常量指针后面的一个4byte的内存吧。。
[/Quote]
是从stack那里pop出来的一个4byte的东西……
Garfield 2009-10-15
  • 打赏
  • 举报
回复
实际上它print的是字符串常量指针后面的一个4byte的内存吧。。
wanghui2008se 2009-10-15
  • 打赏
  • 举报
回复
那要怎么改呢?
butwang 2009-10-14
  • 打赏
  • 举报
回复
sum变量没初始化,是随机的
CCCCCCCCCCCCCCC 2009-10-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ep_sock 的回复:]
有意义么
[/Quote]

没意义,就是没想通

可能是系统随机打印出来的,固定地跟电脑系统有关,也许换台电脑会固定为另外一个值。
Ep_Sock 2009-10-14
  • 打赏
  • 举报
回复
有意义么
CCCCCCCCCCCCCCC 2009-10-14
  • 打赏
  • 举报
回复
a和b尝试着赋过其他值,结果还是:2367460
CCCCCCCCCCCCCCC 2009-10-14
  • 打赏
  • 举报
回复
仅仅是在调试之后把printf("sum is %d\n",sum)改了一下,很久没用过C了,想不起来为什么结果会是:2367460
mstlq 2009-10-14
  • 打赏
  • 举报
回复
结果是不确定的……
xfate 2009-10-14
  • 打赏
  • 举报
回复
printf("sum is %d\n",sum);

69,372

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧