2017-01-04 8 views
2

なぜ以下のコードでランタイムクラッシュが発生するのですか?charポインタの実行時エラーの参照解除

コード自体はあまり便利ではありませんが、charポインタへのポインタを作成し、mainの文字列リテラルを指すことで、このポインタを関数に渡して文字列を読み取ろうとすると問題が発生します。それはなぜ正確ですか?

メインではなく(コメントアウトされた)文字列の配列を作成することによって、文字列の受け渡しや読み取りに問題はありません。あなたの知識のために事前に感謝します。

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

char* GetString(char** strs, int strsSize); 

char* GetString(char** strs, int strsSize) 
{ 
    return *strs; 
} 

int main() 
{ 

    char** stringArr = {"ab", "abc", "abcd"}; 
    //char* stringArr [] = {"ab", "abc", "abcd"}; 

    char* resultStr; 
    resultStr = GetString(stringArr, 3); 

    printf("%s\n", resultStr); 

    return 0; 
} 
+2

ポインタは配列ではありません。配列はポインタではありません。 – StoryTeller

+0

なぜ、 'char ** stringArr = {" ab "、" abc "、" abcd "};'についての警告を出さなかったコンパイラを使用しましたか? – chux

+0

mingw。今すぐ見てください。警告ではなくコンパイラエラーではないのはなぜですか? – Engineer999

答えて

5

stringArrの初期設定は無効です。あなたはポインタではなく、配列へのポインタを持っています。ポインタは{}構文では初期化できません。 -Wall -Wextraしてコンパイルした場合

は、次の警告が生成されます:あなたが持っている

/tmp/x1.c: In function ‘main’: 
/tmp/x1.c:15: warning: initialization from incompatible pointer type 
/tmp/x1.c:15: warning: excess elements in scalar initializer 
/tmp/x1.c:15: warning: (near initialization for ‘stringArr’) 
/tmp/x1.c:15: warning: excess elements in scalar initializer 
/tmp/x1.c:15: warning: (near initialization for ‘stringArr’) 

コメントアウト宣言が正しいものです。

どちらの宣言も、GetStringに渡すことが有効です。これは、配列が関数に渡されたときに最初の要素へのポインタに崩壊するためです。しかし、ポインタと配列は同じものではありません。

関連する問題