2013-02-12 109 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 */ 
) 
); 
相关问题