0

私がやろうとしていること:

printf("Provider: %s\n", Props->providerName);

ここで、structメンバー(外部ライブラリから)は次のとおりです。

char providerName[256];

次のgdb出力でコアダンプが発生します。

Program terminated with signal 11, Segmentation fault.
[New process 73950    ]
#0  0xfee22290 in strlen () from /lib/libc.so.1

char []はnullで終了しないかもしれませんが、最善の解決策は何ですか?

乾杯!


編集:私が使用している構造は外部ライブラリからのものであり、nullではないようです(別のメンバーを正常に印刷できますchar alias[256];

4

5 に答える 5

2

%sprintfで使用する場合は、可能な限り最大幅インジケーターを使用してください。

printf("Provider: %.255s\n", Props->providerName);

それでもセグメンテーション違反が発生し、Propsが発生しないNULL場合は、ヘッダーとライブラリバイナリが衝突している可能性があります。以下を定義する新しいバージョンのヘッダーがあるとします。

struct Thing {
    int foo[256];
    int bar[256];
    int baz[256];
};

ただし、次の定義を使用すると、ライブラリバイナリは古くなっています。

struct Thing {
    int foo[256];
    int bar[256];
};

ここでアクセスしようとするとbaz、他のメンバーが正常に機能していても、セグメンテーション違反が発生します。

(編集:「セグメンテーション違反が発生した場合」から回答の最後にテキストを追加)

于 2012-07-04T10:57:55.110 に答える
1

更新:に 改善さprintf()れましたputchar()

他のいくつかの良い答えが与えられています。ただし、providerNameを変更したくない場合は、次のループbreakが呼び出されます。

int i;
printf("Provider: ");
for (i = 0; i < N; ++i) {
    const char c = Props->providerName[i];
    if (!c) break;
    putchar(c);
}
putchar('\n');

当然、以前にセットconst int N = 256などを持っている必要があり#define N 256ます。必要に応じて、ループを関数呼び出しまたはマクロにカプセル化できます。

ちなみに、上記のループprintf()は、とにかく、何もする必要がなかったでしょう。したがって、これが重要な場合は、高速で実行されます。

于 2012-07-04T11:14:24.963 に答える
0

Props->providerName[255] = 0;使用する前に、データがNULLで終了していることを確認します。

于 2012-07-04T10:56:11.960 に答える
0

プロバイダー名として「IBM」を入力する場合は、strcpy(Props-> ProviderName、 "IBM")を使用します。または、gets(str)を使用してstrに入力を取得し、を使用します。また、gdbを使用してプログラムをコンパイルし、p Propsを使用して値を出力し、Propsが指している値を確認するための最良の方法

于 2012-07-04T11:02:34.890 に答える
0

これは、に含まれるデータの種類の問題ではないようですproviderName

たとえばProps、無効なメモリ位置を参照している可能性があります。NULL

次のようなデバッグ変更を使用して、これをテストできます。

char * p = Props->providerName;
printf("Provider: %s\n", p);

最初の行を実行しようとするとクラッシュするに違いありません。

これをより柔軟に実装する別の方法は次のとおりです。

printf("Provider: %*s%s\n", 
  sizeof (Props->providerName), 
  Props ?Props->providerName :"<no properties available>", 
  Props ?(Props->providerName[sizeof(Props->Props->providerName) - 1] ?" <cut off>" :"") :"");
于 2012-07-04T11:04:07.353 に答える