2013-02-12 112 views
1

有問題的代碼部分正試圖解碼MIPS指令正在使用的寄存器。如何將整數連接到C中的字符串上?

這是通過傳遞寄存器的整數值,然後返回一個包含寄存器名稱的字符串。這樣做的王子聲明在這裏,它調用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又名$ IU(

當它應該是:

$ 6又名$ A2

我在哪裏這個問題呢?

+3

無論'out'足夠大是無關緊要的,返回一個本地陣列仍然未定義的行爲。 – 2013-02-12 16:00:01

+0

確實,試着在你的'sprintf'後面加一個'printf'並看看。此外,使用GDB,有很大幫助 – noMAD 2013-02-12 16:01:19

回答

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

1.它應該是'char * out',2.'sizeof(char)'是1. – 2013-02-12 16:06:27

+0

@ H2CO3感謝'char * out'。是的'sizeof(char)'是'1',但我總是這樣做:) – 2013-02-12 16:08:05

0

數組out是您本地的getreg函數;一旦函數退出,out不再存在,並且返回的指針值不再有效。

這是更好地輸出數組作爲參數傳遞給該函數:

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

並調用它如已經被別人提到的OP返回參照存儲,

char mystr[4]; 
getReg(r, mystr); 
0

作爲如果在撥打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 */ 
) 
); 
相關問題