1

変数:

struct configSetting {
    char *value;
};
char *stringResult;
char str[255];
int intResult;
int *p_intResult;
int i = 0;
p_intResult = &intResult;

私はintを文字列に変換しています:

struct configSetting settings[NUMBEROFSETTINGS];
settings[i].value = itoa(intResult, str, 10);

printf は、正しい値をコンソールに出力します。

printf("\nVALUE: %s", settings[i].value);

その後、別の関数の値をコンソールに書き込んでいます。これら 2 つの printf の間で出力が変わります。

printf("\nTEST 1: %s;%i", settings[15].value, strlen(settings[15].value));
printf("\nTEST 2: %s;%i", settings[15].value, strlen(settings[15].value));

これがコンソールの結果です: TEST 1: 50;2 TEST 2: ý³↑;3

settings[15].value の char* が printf の間で変化していますが、その理由がわかりません。

前もって感謝します!

4

2 に答える 2

4

itoa()の最後の値を後続の呼び出しで上書きしています。

この呼び出し:

settings[i].value = itoa(intResult, str, 10);

変数を使用していますstr[]。これを行うたびに、最後の結果を上書きします。さらに、str[]がローカルでsettingsグローバルの場合、格納された結果のポインタは無効になり、未定義の動作になります。

malloc()またはまたはそのような値文字列を動的に割り当てるstrdup()か、次のように変更します。

struct configSetting {
    char *value;
};

次のように、実際のバッファを含めるには:

struct configSetting {
    char value[64];
};

そして、itoa()直接設定に:

itoa(intResult, settings[i].value, 10);
于 2013-02-20T08:30:37.910 に答える
2

同じバッファを使用しており、変換されたすべての値についてstrそのバッファへの参照()を保存しています。settings[i].value = itoa(intResult, str, 10);次の呼び出しitoaは古い値を上書きします。

于 2013-02-20T08:30:26.873 に答える