、少なくとも3つの2を使用すると、(1つの提案は、コンパイラの警告を有効にすることです - 彼らはしばしば「愚かな過ちを」拾う)セグメンテーション違反ここで取得することができますがあります。
問題がtest
がおそらくmisdeclaredされていることで、それはおそらくされている必要があります:
char *test[]={"0x11","0x12","0x13","0x00","0x00"};
あなたはその配列内の最初のポインタでtest
を初期化することを意味char*
の配列とchar*
を初期化 - どのtest
が文字列リテラル"0x11"
を指していることを意味するので、strncpy
のtest[3]
を引数として使用すると、ポインタに変換される1
が送信されます(おそらくアドレスは0x31
になります)。 strncpy
は、許可されていない最も可能性のあるそのアドレスに書き込みをしようとするだろう。あなたは(それが文字列の終端ヌルですbecaseあなたがtest[4]
にアクセスすることができます)許可されない文字列の終わりを超えてアクセスするように求められますtest[5]
使用していた場合は、ここではほぼ第四理由がありました。
これらの問題を修正しても、test[3]
とtest[4]
は文字列リテラルを使用して初期化されるため、問題があります。その後strncpy
は未定義の動作ですリテラル、文字列を変更しようとする - test[3]
とtest[4]
が読み取り専用メモリに常駐しているためセグメンテーション違反がある(それらが読み取り専用メモリにできるようにすることは、文字列リテラルを変更すると、未定義の動作である理由の一つです)。
test
に書込み可能なコピーがあることを確認してください。これは、Cではそれほど単純ではないかもしれません。通常の解決策の1つは、手動で呼び出す必要がある機能を設定することですそれを切断test
、もう1つは:
void init_test(void) {
int j;
for(j=0; j<sizeof(test)/sizeof(test[0]); j++)
test[j] = strdup(test[j]);
}
void init_fini(void) {
int j;
for(j=0; j<sizeof(test)/sizeof(test[0]); j++)
free(test[j]);
}
あなたのコンパイラの警告をオンに: '-pedantic -Wall -Werror -std = c11'。 –
何らかの理由で、テストは文字列の配列(char **)で初期化されます。私はそれが最初のところでどのように機能するのだろうか。 –
最後の行の多くの箇所で構文エラーが発生しないのでしょうか?(0x66は文字列ではなく数値であり、暗黙的に不正なポインタに変換される可能性があります) –