比较两个内存地址并显示它们相等

时间:2016-09-25 17:31:38

标签: c

char *str="012";

int main(int argc, char *argv[])
{

    if(str == argv[1])
    { 
        printf("success");
    }
}

输出:./ test 0x400634

然后我应该得到输出成功。

但我无法获得任何输出。如何比较这两个地址并打印它们是相同的。 请帮忙......

2 个答案:

答案 0 :(得分:2)

我认为你对C语言字符串的工作方式感到有些困惑。

字符串是字符数组,两个具有相同内容的字符串不一定具有相同的地址。

此外,argv仅包含字符串。如果将数字传递给程序,它将被解释为字符串,而不是数字。因此,当您将argv[1]str进行比较时,即使您知道str将在哪个地址(您不能),您也会比较str的地址到argv[1]的地址,而不是其内容。

如果您希望将argv[1]抽取为数字,请使用strtol(如此处所述:https://stackoverflow.com/a/20654510/2830652

if ((long)str == strtol(argv[1], NULL, 16))
{
    printf("success");
}

允许您比较正确的数据,只需在将其传递给您的程序时省略地址的0x部分。

答案 1 :(得分:0)

比较内存地址可能会有些棘手。

我将从简单的案例开始,然后转到 2个更高级的案例

有关代码的完整说明,我发布了一个youtube视频。

https://www.youtube.com/watch?v=Yk9ROvIQCts

但是,这段代码中的注释本身就足够了。

#include <stdio.h> //:for: printf(...)

//: Generic function pointer type:
//: Only DATA pointers can be cast to void*
//: Function pointers CANNOT be cast to void*
typedef void ( * GenFunc ) ( void );

struct global_state{

    int val;

}GS;

int  Func_A(   void   ){ return 5    ; }
void Func_B( int  val ){ GS.val = val; } 

int main( void ){
    printf("[BEG :main]\n");



    //|1|1|1|1|1|1|1|1|1|1||1|1|1|1|1|1|1|1|1|1|//
    //| Compare Addresses of KNOWN types:      |//
    //|1|1|1|1|1|1|1|1|1|1||1|1|1|1|1|1|1|1|1|1|//
    int a = 6;                             //|1|//
    int b = 6;                             //|1|//
                                           //|1|//
    int* ptr_1 = &( a );                   //|1|//
    int* ptr_2 = &( b );                   //|1|//
    int* ptr_3 = &( a );                   //|1|//
                                           //|1|//
    if( ptr_1 != ptr_2 ){                  //|1|//
        printf("[ptr : <> ]\n");           //|1|//
    };;                                    //|1|//
    if( ptr_1 == ptr_3 ){                  //|1|//
        printf("[ptr : == ]\n");           //|1|//
    };;                                    //|1|//
    //|1|1|1|1|1|1|1|1|1|1||1|1|1|1|1|1|1|1|1|1|//



    //|2|2|2|2|2|2|2|2|2|2||2|2|2|2|2|2|2|2|2|2|//
    //| Compare addresses of function pointers |//
    //| without casting to (void*). It is      |//
    //| undefined behavior to cast function    |//
    //| pointers to (void*).                   |//
    //|2|2|2|2|2|2|2|2|2|2||2|2|2|2|2|2|2|2|2|2|//
    GenFunc gfp_1 = (GenFunc) &( Func_A ); //|2|//
    GenFunc gfp_2 = (GenFunc) &( Func_B ); //|2|//
    GenFunc gfp_3 = (GenFunc) &( Func_A ); //|2|//
    if( gfp_1 != gfp_2 ){                  //|2|//
        printf("[gfp : <> ]\n");           //|2|//
    };;                                    //|2|//
    if( gfp_1 == gfp_3 ){                  //|2|//
        printf("[gfp : == ]\n");           //|2|//
    };;                                    //|2|//
    //|2|2|2|2|2|2|2|2|2|2||2|2|2|2|2|2|2|2|2|2|//



    //|3|3|3|3|3|3|3|3|3|3||3|3|3|3|3|3|3|3|3|3|//
    //| wglGetProcAddress returns generic      |//
    //| function pointer. The documentation    |//
    //| says we need to check for:             |//
    //|                                        |//
    //| 0x00, 0x01, 0x02, 0x03, or -1          |//
    //|                                        |//
    //| for failure.                           |//
    //|                                        |//
    //| PRETEND gfp_1 was fetched using        |//
    //| wglGetProcAddress.                     |//
    //| (Note: Zero is special and does NOT )  |//
    //| (      require a cast.              )  |//
    //|3|3|3|3|3|3|3|3|3|3||3|3|3|3|3|3|3|3|3|3|//
    if(                                    //|3|//
        (gfp_1 ==           0  ) ||        //|3|//
        (gfp_1 == (GenFunc) 0x1) ||        //|3|//
        (gfp_1 == (GenFunc) 0x2) ||        //|3|//
        (gfp_1 == (GenFunc) 0x3) ||        //|3|//
        (gfp_1 == (GenFunc)  -1) ||        //|3|//
    0){                                    //|3|//
        printf("[Failure!]");              //|3|//
    };;                                    //|3|//
    //|3|3|3|3|3|3|3|3|3|3||3|3|3|3|3|3|3|3|3|3|//



    printf("[END :main]\n");
}