char *str="012";
int main(int argc, char *argv[])
{
if(str == argv[1])
{
printf("success");
}
}
输出:./ test 0x400634
然后我应该得到输出成功。
但我无法获得任何输出。如何比较这两个地址并打印它们是相同的。 请帮忙......
答案 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");
}