所以我试图返回一个包含字符串的变量,其中包含一些在函数内部确定的参数。
char* render(my parameters)
我宣布我的变量是这样的:
char *string = malloc(sizeof(char) * 50);
这是我的功能的摘录:
switch(INST_OPCODE){
case 0x00:
inst->name = malloc(sizeof(char) * (strlen("add") + 1));
inst->name = "add";
inst->type = 1;
snprintf(string, sizeof(string), "add r%d, r%d, r%d", INST_RD, INST_RA, INST_TYPE_A_RB);
printf("add r%d, r%d, r%d", INST_RD, INST_RA, INST_TYPE_A_RB);
return string;
case 0x01:
inst->name = malloc(sizeof(char) * (strlen("rsub") + 1));
inst->name = "rsub";
inst->type = 1;
snprintf(string, sizeof(string), "rsub r%d, r%d, r%d", INST_RD, INST_RA, INST_TYPE_A_RB);
printf("rsub r%d, r%d, r%d", INST_RD, INST_RA, INST_TYPE_A_RB);
return string;
printf运行正常,它仅用于调试目的,但当我在一个文件中打印返回的变量时:
fprintf(fd, "%s\n", render(my parameters));
它只写了4个字符,然后是字面上的内存垃圾,一个例子:
addi-ž
请给我一些关于这里发生了什么的见解。
答案 0 :(得分:2)
在你的情况下,snprintf
的第二个参数必须是50,不是 sizeof(字符串)。
答案 1 :(得分:1)
4是32位系统上指针的大小,在64位系统上是8。对于指针,sizeof总是返回指针的大小而不是它指向的数据的大小。
更好的是,使用sizeof(char) * num_characters_in_string
。在这种情况下使用sizeof(char) * 50
。
当然,sizeof(char)
总是等于1,所以如果你愿意,你可以省略那部分。
您获得垃圾的原因是因为某些数据未初始化(由于size参数)。调试器自动将everthing初始化为0,这就是调试时它可以工作的原因。在调试之外,它可以从任何值开始。
最后,printf
语句有效,因为您没有打印出返回值。写printf("%s", string);
而不是重复你的snprintf线可能更为谨慎。 (请记住 - snprintf最多只打印n个字符,因此剩下的字符留下了垃圾值。)