1

有问题的代码部分试图解码 MIPS 指令正在使用的寄存器。

这是通过传入寄存器的整数值来实现的,然后应该返回一个包含寄存器名称的字符串。执行此操作的王子语句在这里,它调用 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 又名 $ìü(

什么时候应该:

$6 又名 $a2

我哪里错了?

4

3 回答 3

4

You are returning address of a local variable (out).

char* getReg(int d) {
 char out[4];
 sprintf(out, "a%d", (d - 4));
 return out;
}

scope and life of out is within function getReg() only.

Allocate memory dynamically for out to return and access outside function. (and large enough), like below

#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;
}

and don't forget to free memory.

于 2013-02-12T16:01:10.533 回答
0

该数组out对于您的函数是本地的getreg;一旦函数退出,out不再存在并且您返回的指针值不再有效。

最好将输出数组作为参数传递给函数:

void getReg(int d, char *str)
{
  sprintf(str, "a%d", (d-4));
}

并将其称为

char mystr[4];
getReg(r, mystr);
于 2013-02-12T16:04:47.953 回答
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 */
  )
);
于 2013-02-12T17:48:44.313 回答