有问题的代码部分是试图解码MIPS指令正在使用的寄存器。
这是通过传入寄存器的整数值然后返回包含寄存器名称的字符串来实现的。执行它的prince语句就在这里,它调用getReg来获取字符串。
printf("$%d aka $%s\n", itype->rs, getReg(itype->rs));
到目前为止,我已尝试将它们连接起来(没有case语句):
char* getReg(int d) {
char out[4];
sprintf(out, "a%d", (d - 4));
return out;
}
但输出结果如下:
$ 6 aka $ìü(
应该是:
$ 6又名$ a2
我在哪里错了?
答案 0 :(得分:4)
您正在返回局部变量的地址(out
)。
char* getReg(int d) {
char out[4];
sprintf(out, "a%d", (d - 4));
return out;
}
out
的范围和生命仅在函数getReg()
内。
为out
动态分配内存以返回并访问外部函数。 (足够大),如下所示
#define SIZE 25
char* getReg(int d) {
char *out = malloc(SIZE*sizeof(char));
sprintf(out, "a%d", (d - 4)); // I don't know about calculation??
return out;
}
并且不要忘记释放记忆。
答案 1 :(得分:0)
数组out
是getreg
函数的本地数组;一旦函数退出,out
不再存在,并且返回的指针值不再有效。
最好将输出数组作为参数传递给函数:
void getReg(int d, char *str)
{
sprintf(str, "a%d", (d-4));
}
并将其命名为
char mystr[4];
getReg(r, mystr);
答案 2 :(得分:0)
正如其他人已经提到的那样,OP会返回对存储的引用,如果在printf()
的调用中使用该存储,则该引用已无效。
提供外部缓冲区的替代方法是:
char * getReg(int d, char * out)
{
sprintf(out, "a%d", (d - 4));
return out;
}
...
printf(
"$%d aka $%s\n",
itype->rs,
getReg(
itype->rs,
(char[32]){0} /* provide a 32 byte long buffer, initialised to 0s */
)
);