簡體   English   中英

為什么我會收到此訪問權限?

[英]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]);

請注意,使用snprintfsprintf_s ,以避免覆蓋緩沖區的可能性,這可能是一個好主意。 (由於你使用的是C ++,你也可以輕松地使用其中一個C ++格式庫,比如Boost.Format ,為你做內存分配 - 但這是另一個主題。)

問題出在這里: char* result = "";

您正在嘗試打印到常量字符串(空字符串)。 從sprintf的文檔關於第一個參數:

指向存儲結果C字符串的緩沖區的指針。 緩沖區應足夠大以包含結果字符串。

您需要分配一個緩沖區來打印。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM