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)。
所以我正在尝试 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)。