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

C: Why does snprintf only writes 4 characters to my variable?

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

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 工作正常,它只是为了调试目的,但是当我在文件中打印 returned 变量时:

fprintf(fd, "%s\n", render(my parameters));

它只写了4个字符然后字面上是内存垃圾,一个例子:

addi-ž

请告诉我这里发生了什么。

4 是指针在 32 位系统上的大小,在 64 位系统上是 8。对于指针,sizeof 总是 return 指针的大小而不是它指向的数据的大小。

更好的是,使用 sizeof(char) * num_characters_in_string。在这种情况下使用 sizeof(char) * 50

当然,sizeof(char)总是等于1,所以你可以省略那部分。

你得到垃圾的原因是因为一些数据没有初始化(由于大小参数)。调试器会自动将所有内容初始化为 0,这就是它在调试时可以工作的原因。在调试之外,它可以从任何值开始。

最后,printf 语句起作用了,因为您没有打印出 return 值。编写 printf("%s", string); 而不是重复 snprintf 行可能更为谨慎。 (记住 -- snprintf 最多只打印 n 个字符,因此其余字符都保留了它们的垃圾值)。

在你的情况下,snprintf 的第二个参数需要是 50,不是 sizeof(string)。