2017-12-20 6 views
2

私はCの空白関数と文字列を試しています。私はこのプログラムを試しました:C同じ配列を印刷すると、2つの方法で異なる結果が得られます。

#include <stdio.h> 
#include <string.h> 

void print(char** test); 
int main(){ 
    char* test = "abcdef"; 
    print(&test); 
    return 0; 
} 
void print(char** test){ 
    for(int i=0;i<strlen(*test);i++) 
     printf("%c\n",*test[i]); 
} 

私は最初にa A �セグメンテーションフォールトを表示します。しかし、*test[i]*(*test+i)に変更した後は、ほぼ同じことですが、期待通りに動作します。

*test[i]*(*test+i)がない場合、私のコードが2番目の例で動作するのはなぜですか?

+8

これは[*演算子優先順位*](http://en.cppreference.com/w/c/language/operator_precedence)の問題です。配列インデックス演算子 '[]'は、逆参照演算子 '*'よりも高い優先順位を持ちます。何か[良い初心者の本](http://stackoverflow.com/questions/562303/the-definitive-c-book-guide-and-list)はあなたに(IMO)告げていたはずです。 –

+4

また、「ほぼ同じもの」は*「*正確には同じもの」ではありません。実際、あなたが「ほぼ同じもの」と考える2つの表現は*ではない*です。 (なぜ私の前のコメントを参照してください)。 –

+2

これを修正するには '(* test)[i]'を実行できますか? –

答えて

4

testは、char**である。いくつかのプログラマーの男がコメントしとして、[]*よりも優先されますので、あなたのforループは、次のように実行されます。

  1. *test[0] == *(test[0]) == 'a'
  2. *test[1] ==に保存されている*(test[1]) == *(いくつかの他のアドレスメモリの後&test)=> UB

どちらのプログラム全体で1つの間接を使用する(すなわち*、**はないと&test)、または使用(*test)[i]

関連する問題