首頁  >  問答  >  主體

c++ - strcmp参数为char**,也能正常运行?

strcmp 函数库中的声明:

int __cdecl strcmp (
        const char * src,
        const char * dst
        )
#include<string.h>
#include<stdio.h>
 
int main( void )
{
      char *s1 = "abcdkkkd";
      char *s2 = "oefjeofjefo";
  
      printf( "%d", strcmp( &s1, &s2 ) );
  
      return 0;
}

程序为什么会正常运行?

迷茫迷茫2715 天前619

全部回覆(4)我來回復

  • 天蓬老师

    天蓬老师2017-04-17 14:25:29

    int strcmp( const char *lhs, const char *rhs );
    函數聲明,c99 跟c11 略有差別,但不影響。

    傳入的就是指針,就算傳入字串變量,其實還是一個位址。

    比較的是從指標位址開始到空字元 之間的字串。

    針對你的問題,其實比较的并不是你列出的两个字符串而是地址开始的字符串,也許你會覺得這個位址開始不是字串,那麼C 自己在記憶體中往後找,直到你遇到空字串。

    回覆
    0
  • 怪我咯

    怪我咯2017-04-17 14:25:29

    在vs2015上試過,報錯:「char*類型的實參與const char類型的形參不相容」

    回覆
    0
  • PHPz

    PHPz2017-04-17 14:25:29

    我沒編譯通過啊。提示 error: cannot convert 'const char**' to 'const char*' for argument '1' to 'int strcmp(const char*, const char*)'。但是樓主你,傳入的參數不是那個字串的位址啊!你傳入的是變數的位址啊。 s1&s1是不一樣的!

    回覆
    0
  • 迷茫

    迷茫2017-04-17 14:25:29

    Gcc編譯結果如下:
    strcmp.c:9:5: warning: passing argument 1 of 'strcmp' from incompatible pointer type [enabled by default]
    你那隻是編譯通過了,因為傳入的都是地址,所以只報了warning而已,但實際上運行結果還是錯的。

    回覆
    0
  • 取消回覆