1

問題のコードの部分は、MIPS 命令で使用されているレジスタをデコードしようとしています。

これは、レジスタの整数値を渡すことで実行され、レジスタの名前を含む文字列が返されます。これを行うプリンス ステートメントはここにあります。ここでは、文字列を取得するために getReg を呼び出します。

printf("$%d aka $%s\n", itype->rs, getReg(itype->rs));

これまでのところ、これを連結して(ケースステートメントなしで)試しました:

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

しかし、出力は次のようになります。

$6 別名 $ìü(

それがいつあるべきか:

$6 別名 $a2

これのどこが間違っているのですか?

4

3 に答える 3

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

メモリを解放することを忘れないでください。

于 2013-02-12T16:01:10.533 に答える
0

他の人がすでに述べたように、OP は storage への参照を返します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 に答える
0

配列outgetreg関数に対してローカルです。関数が終了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 に答える