0

ここで何かばかげたことをしているのかもしれませんが、C++ で作業してからしばらく経ち、何らかの理由で sprintf が呼び出されるとアクセス違反が発生し続けます。とにかく、ここに私が使用しているコードがあります:

char *value, *result;
int len;
result = "";
mgr.GetObjValue(0, value, len);

for (int i = 0; i < len; i++) 
{
  sprintf(result, "%s %X", result, value[i]);
}

printf("ObjVal: %s\n\n", result);

GetObjValue の機能に興味がある人は、私が使用している API から SNMP オブジェクトの値を取得するだけです。宣言は次のとおりです。

int SNMPMgr::GetObjValue(int iObjIndex, char *&lpObjValue, int &lenObjValue);

どんな助けでも大歓迎です

4

2 に答える 2

2

sprintfメモリ割り当てを行いません。データを保持するのに十分な長さの書き込み可能なバッファへのポインタが与えられることを期待しています。

char *result;

この時点では、結果の内容は未定義です。

result = "";

この時点で、result は 1 バイトの静的な読み取り専用文字列 (終端の null) を指します。

sprintf(result, "%s %X", result, value[i]);

この時点で、サイズ 1 の読み取り専用領域に任意の長さの文字列を書き込もうとしました。

代わりに次のようにします。

char result[1024];
sprintf(result, "%s %X", result, value[i]);

snprintfまたはsprintf_sを使用して、バッファを上書きする可能性さえも回避することは、おそらく良い考えであることに注意してください。(C++ を使用しているので、 Boost.Formatなどのメモリ割り当てを行う C++ 書式設定ライブラリの 1 つを簡単に使用することもできますが、それはまったく別のトピックです。)

于 2012-11-29T17:49:52.160 に答える
0

問題はここにあります:char* result = "";

定数文字列 (空の文字列) に出力しようとしています。最初のパラメーターに関する sprintf のドキュメントから:

結果の C 文字列が格納されるバッファーへのポインター。バッファーは、結果の文字列を格納するのに十分な大きさである必要があります。

印刷するバッファを割り当てる必要があります。

于 2012-11-29T17:49:32.613 に答える