這裏是我的功能:的sprintf本身削減輸出字符串
char *HexCastName(UINT Address) {
char Name[100] = "";
UINT Offset;
for (int i = 0; i < HardNames.size(); i++) {
if (HardNames[i].Array == Hex.CurrentRegion.Array &&
HardNames[i].Start <= Address &&
HardNames[i].Start + HardNames[i].Size > Address) {
Offset = Address - HardNames[i].Start;
sprintf(Name, " : %s[%d]", HardNames[i].Name, Offset);
}
}
return Name;
}
我這樣做:
char name[100];
sprintf(name, HexCastName(SELECTION_START));
結果字符串name
只有4位數,雖然HexCastName()
回報更多。我試圖追蹤它,並且它似乎將整個字符串傳遞給sprintf()
,並且在其中的某個位置,它獲取到_output_l(outfile,format,NULL,arglist)
函數。在裏面,format
變量最初包含我的整個字符串,然後在讀取一些變量後,執行從output.c中的973跳轉到978,並且我的format
已被截斷。我完全被這種行爲困惑......爲什麼4個字母?也許一些指針和字符失敗?
編輯:
這裏,似乎工作的版本:
void HexCastName(char *buff, UINT size, UINT Address) {
sprintf(buff, "");
UINT Offset;
for (int i = 0; i < HardNames.size(); i++) {
if (HardNames[i].Array == Hex.CurrentRegion.Array &&
HardNames[i].Start <= Address &&
HardNames[i].Start + HardNames[i].Size > Address) {
Offset = Address - HardNames[i].Start;
_snprintf(buff, size, " : %s[%d]",HardNames[i].Name, Offset);
}
}
}
char *name = (char *)malloc(100);
HexCastName(name, 100, SELECTION_START);
sprintf(str, "%s: $%06X%s", area,
Hex.AddressSelectedFirst + Hex.CurrentRegion.Offset, name);
free(name);
您正在返回一個自動存儲VAR的地址 - UB。 – 2014-09-21 08:26:08