次のようにヘッダーで定義された構造体があります。
#define LC_ERR_LEN 300
typedef struct dLC_ERRMSG {
short nr;
short strategy;
char tx[LC_ERR_LEN];
} LC_ERRMSG;
私は自分のコードで次のように使用します:
LC_ERRMSG err;
char *szError;
szError = strerror(sStatus);
snprintf(err.tx,LC_ERR_LEN," %s - %s",szFilename,szError);
/* do something with our error string */
それはうまくいきます。ただし、LC_ERRMSG err;
グローバルに宣言した場合、つまり、使用されている関数の外で、またはextern LC_ERRMSG err;
(中央の場所でエラーステータスを読み取れるようにしたいので、これは私の当初の意図でした)、コードは snprintf 呼び出しでセグメンテーション違反を起こします。 .
理由を教えてください。
ddd は、グローバルに宣言されたときにメモリがすべてゼロに初期化されるか、extern が宣言されたときに少なくとも初期化されて読み取り可能であることを示しています。値 szFilename、szError、および LC_ERR_LEN はすべて正しく、意味があります。