注册 登录
编程论坛 汇编论坛

老大呢,关于字符串比较问题

wp231957 发布于 2012-11-18 11:19, 601 次点击
int main(int argc,char *argv[])
{
    //解析命令行部分
    if(argc<2) goto _main;
    if(argv[1]=="/?")   //大家都知道字符串比较应该用strcmp来比较,而不能用==直接比较
                        //但是为什么呢,用OD看了一下源代码 没看懂啊
    {
        printf("可接受 /? /h 参数 其他参数被忽略\n");
        printf("本程序的作用是用于计算三角形面积\n");
        printf("请用空格分开三条边的参数 例如:4 5 6\n");
        return 0;
    }
_main: //程序主体部分
只有本站会员才能查看附件,请 登录


2个都是 ascii "\?"  为什么不相等呢,难道和那个DWORD PTR 有关

[ 本帖最后由 wp231957 于 2012-11-18 11:20 编辑 ]
4 回复
#2
zklhp2012-11-18 11:31
因为在C语言里

argv[1]就相当于一个地址
"/?"也相当于一个地址 而两个地址是不相等的 所以不相等

但在个别时候是存在"asdf" == "asdf" 的情况的 那是因为这俩字符串在编译出的程序里面就是一个 所以地址也相等 所以相等 但这不一定 和编译器和环境相关

以上是从C的角度说的 网速慢图看不全 搬砖的环境真差啊
#3
wp2319572012-11-18 11:36
汇编角度呢

图片看不全  可以下载啊

C角度解释 可以接受了
#4
zklhp2012-11-18 11:57
以下是引用wp231957在2012-11-18 11:36:33的发言:

汇编角度呢

图片看不全  可以下载啊

C角度解释 可以接受了

牵扯堆栈得画一下

此时堆栈是

低                              高
...局部变量...|ebp|返回值|argc|argv|
              ^
              ebp         
此时ebp指向了上面的ebp..

[ebp+C]也就是argv 一个指针数组 数组内的每个元素是是个指针 这个数组的首地址赋值给eax 然后[eax+4]取第二个元素 是一个指针 也就是C里面的argv[1] 这里最终得到了一个指针

下面那个也是指针 而这俩指针必然不相等 一个是你输入的 一个是代码编译的时候就有的 肯定没法比

所以这里比的最终还是指针而非字符串

[ 本帖最后由 zklhp 于 2012-11-18 11:59 编辑 ]
#5
有容就大2012-11-18 12:53
Z版说的很好
数据区里面的0041ca30是个地址吧。
1