[英]Why am I getting this access violation?
我可能在這里做了一些愚蠢的事情,但是因為我在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);
任何幫助將非常感激
sprintf
不做內存分配。 它期望得到一個指向可寫緩沖區的指針,該緩沖區的長度足以容納數據。
char *result;
此時,結果的內容未定義。
result = "";
此時,結果指向1個字節的靜態只讀字符串(終止空值)。
sprintf(result, "%s %X", result, value[i]);
此時,您只是嘗試將一個任意長的字符串寫入大小為1的只讀區域。糟糕。
做這樣的事情:
char result[1024];
sprintf(result, "%s %X", result, value[i]);
請注意,使用snprintf或sprintf_s ,以避免覆蓋緩沖區的可能性,這可能是一個好主意。 (由於你使用的是C ++,你也可以輕松地使用其中一個C ++格式庫,比如Boost.Format ,為你做內存分配 - 但這是另一個主題。)
問題出在這里: char* result = "";
您正在嘗試打印到常量字符串(空字符串)。 從sprintf的文檔關於第一個參數:
指向存儲結果C字符串的緩沖區的指針。 緩沖區應足夠大以包含結果字符串。
您需要分配一個緩沖區來打印。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.