C:为什么snprintf只将4个字符写入我的变量?

时间:2015-06-17 18:19:09

标签: c printf malloc

所以我试图返回一个包含字符串的变量,其中包含一些在函数内部确定的参数。

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-ž

请给我一些关于这里发生了什么的见解。

2 个答案:

答案 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个字符,因此剩下的字符留下了垃圾值。)