社区
C语言
帖子详情
一个非常简单的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
打赏
收藏
一个非常简单的C程序的运行结果
#include main() { int a,b,sum; a=1;b=2; sum=a+b; printf("sum is %d\n"); } 结果是:2367460 为什么?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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);
220个经典C语言源码
001 第
一个
C
程序
002
运行
多个源文件 003 求整数之积 004 比较实数大小 005 字符的输出 006 显示变量所占字节数 007 自增/自减运算 008 数列求和 009 乘法口诀表 010 猜数字游戏 011 模拟ATM(自动柜员机...
C语言
程序
运行
结果闪退怎么办
学习编译C语言的朋友们可能会遇到这样的问题,
程序
调试的时候没有错误,可是在
运行
结果的时候会发现
程序
结果闪退,导致看不到结果。关于此类问题,给出以下解决方案。 以最简单
程序
为例 法一:在主函数末尾下一...
简单c语言
程序
例子与
运行
结果图,C语言
程序
第一次作业
判断闰年(1)题目输入
一个
四位年份,判断其是否是闰年。闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。(2)流程图 (3)测试数据及
运行
结果测试数据1:y=1980
运行
结果: (4)实验分析没错误3.求...
c语言的
运行
环境和
运行
c
程序
的方法,C语言实验报告实验一C
程序
的
运行
环境和
运行
C
程序
的方法...
(2) 了解在该系统上如何编辑、连接和
运行
一个
C
程序
。(3) 通过
运行
简单的C
程序
,初步了解C 源
程序
的特点。2. 实验内容和步骤(1) 检查所用的计算机系统是否已安装了C 编译系统并确定他所在的子目录。(2) 进入所用的...
【C
程序
设计】——最简单的C语言
程序
其中第1行是
程序
运行
后输出的结果,第2行是Visual C++ 6.0系统在输出完
运行
结果后自动输出的一行信息,告诉用户“如果想继续进行下一步,请按任意键”,当用户按任意键后,屏幕上不再显示
运行
结果,而返回
程序
窗口,...
C语言
69,372
社区成员
243,080
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章