这里是我的功能:的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