鱼C论坛

 找回密码
 立即注册
查看: 3717|回复: 8

不明白

[复制链接]
发表于 2011-4-9 19:48:12 | 显示全部楼层 |阅读模式

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

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

x
char* a[] = {"helloworld","fishc.com"};

        printf("%s\n", a[0]);
        printf("%s\n", a);
输出的结果是:helloworld
                     ?B
这是为什么呢?这两个地址都是一样的,为什么结果不一样呢?
7:        printf("%s\n", a[0]);
0040D716   mov         eax,dword ptr [ebp-8]
0040D719   push        eax
0040D71A   push        offset string "%s\n" (00422fb4)
0040D71F   call        printf (00401060)
0040D724   add         esp,8
8:        printf("%s\n", a);
0040D727   lea         ecx,[ebp-8]                            // 不同在这里
0040D72A   push        ecx
0040D72B   push        offset string "%s\n" (00422fb4)
0040D730   call        printf (00401060)
0040D735   add         esp,8
这是为什么呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-4-10 12:05:24 | 显示全部楼层
0040D727   lea         ecx,[ebp-8]  // lea是取得[ebp-8]的地址给ecx,也就是保存数组的地址。而不是数组的元素,也就是说不是取得该元素(在这指字符串常量的地址)。

~下次建议把 fishc.com放前头哈~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-4-10 15:44:10 | 显示全部楼层
回复 2# 小甲鱼
记住啦,下次放前面,支持小甲鱼,支持fishc.com
printf("%d\n", a);
printf("%d\n", a[0]);
printf("%d\n", a[1]);
    输出结果:
1245048
4333612
4333600
虽然这三个数里面存的都是地址,但是a的值为什么和a[0]的值不相同呢?
我记得一个数组,a,&a[0]它们的值好像是不同的,a存放的是整个数组的地址
学程序一个难题就是:今天你测试可能和书的说的相同,但是明天再去测试又变了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-4-10 15:49:46 | 显示全部楼层
00401010   push        ebp
00401011   mov         ebp,esp
00401013   sub         esp,48h
00401016   push        ebx
00401017   push        esi
00401018   push        edi
00401019   lea         edi,[ebp-48h]
0040101C   mov         ecx,12h
00401021   mov         eax,0CCCCCCCCh
00401026   rep stos    dword ptr [edi]
每个程序的前面问题出现这几行,看不懂,能否详细的解释一下啊 主要是几个关键字,ebp,因为下面的汇编总是用到这个ebp关键字,ebp和eax相似吗?还有esp ebx esi ecx,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-4-10 17:42:05 | 显示全部楼层
回复 3# wxf


    &a[0] == a 都是数组第一个元素所在的地址,也就是数组的起始地址。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-4-10 17:44:04 | 显示全部楼层
回复 4# wxf

00401010   push        ebp                        // 保存 ebp的值
00401011   mov         ebp,esp                 // ebp指向esp
00401013   sub         esp,48h                  // 初始化栈
00401016   push        ebx                        
00401017   push        esi
00401018   push        edi                         // 保存相关寄存器
00401019   lea         edi,[ebp-48h]
0040101C   mov         ecx,12h
00401021   mov         eax,0CCCCCCCCh
00401026   rep stos    dword ptr [edi]     // 初始化栈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-4-10 20:43:27 | 显示全部楼层
本帖最后由 wxf 于 2011-4-10 20:45 编辑

回复 6# 小甲鱼

鱼哥,最上面那个数组问题我明白了,但是上面那个我还是有疑惑,是不是我很纠结,但是我还是想问明白 。
上面那段汇编代码是不是为接下来的程序开辟一段内存空间,比如上面48就是这个程序需要的内存空间。ebp是高地址,edi存储的就是低地址了,中间那些代码意思就不知道了。说一下更好呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-4-10 22:50:48 | 显示全部楼层
中间是循环指令,将整个栈填充0xcccccccc进行初始化~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-3-28 13:49:28 | 显示全部楼层
char* a[] = {"helloworld","fishc.com"};

        printf("%s\n", a[0]);
        printf("%s\n", *a);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-2-6 06:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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