10

次の方法で strcmp を使用しています

  1. char[] 配列名を渡す
  2. 文字列リテラルへのポインターを渡しますが、2 番目の結果はセグ フォールトになります。ポインターが正しい文字列リテラルを指していることを確認しましたが、なぜセグフォルトが発生するのか混乱しています。コードは次のとおりです。

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(int argc, char const *args[])
    {
      char firstName[strlen(*++args)];
      strcpy(firstName, *args);
      char lastName[strlen(*++args)];
      strcpy(lastName, *args);
      printf("%s\t%s\n", firstName, lastName);
    
      printf("%d\n", strcmp(firstName, lastName));// this works
    
      printf("%d\n", strcmp(*(--args),*(++args)));//this gives me a seg fault
    
      return EXIT_SUCCESS;
    }
    

それを str.c として保存しています。コンパイルすると、最初に次の警告が表示されます。

[Neutron@Discovery examples]$ gcc -Wall str.c -o str

str.c: In function ‘main’:
str.c:15: warning: operation on ‘args’ may be undefined

最後にそれを実行すると、以下に示すようにセグフォルトが発生します

[Neutron@Discovery examples]$ ./str Jimmy Neutron


Jimmy   Neutron

-4

Segmentation fault (core dumped)
4

2 に答える 2

14

同じ関数に同じ変数を 2 つの異なるパラメーターとして 2 回渡す場合は--、 andを使用しないでください。++

それ以外のprintf("%d\n", strcmp(*(--args),*(++args)));

行う

char *first = *(--args);
char *second = *(++args);
printf("%d\n", strcmp(first,second));

まだ実際には判読できませんが (インデックスを使用しargcて有効性を確認することをお勧めします)、少なくとも値を変更せず、同じシーケンス ポイントで複数回評価します。

于 2011-06-10T04:18:00.143 に答える
6

littleadv の投稿に加えて、バッファーが 1 文字短すぎます (null ターミネーター用のスペースがありませんでした)。したがって、strcpyバッファオーバーフローが発生します。

于 2011-06-10T04:19:06.487 に答える