#include <stdio.h>
#include <stdlib.h>
int main()
{
int num = 1;
char* test[8];
sprintf(test[0],"%d",num);
printf("%s\n",test[0]);
}
答案 0 :(得分:9)
char *test[8]
是一个8 char *
的数组,或指向字符串的指针,因为你没有指定,所以它们都被设置为垃圾值。所以sprintf
正在尝试将数据写入who-know-where。
您应该使用char test[8]
代替char
分配8 sprintf(test, "%d", num);
,然后char *
的数组。
更新:如果你想使用char *test = malloc(8 /* see note below */);
sprintf(test, "%d", num);
指针,你应该分配空间:
char *
如果你想使用一个char *test[8]; // 8 pointers to strings
test[0] = malloc(8); // allocate memory for the first pointer
sprintf(test[0], "%d", num);
指针数组,它的工作原理是相同的:
malloc
请注意,您必须分别为test[0]
至test[7]
分别致电snprintf()
。
此外,如评论中所述,如果您的编译器支持它,您应该使用sprintf
。它就像snprintf(test, 8, "%d", num);
,但需要一个额外的参数,即缓冲区的大小:
snprintf
并保证不会占用超出您允许的空间。它更安全,如果你需要,realloc
会返回它实际需要的空间量,所以如果你给它的空间太小,你可以malloc(8 * sizeof(char))
再试一次。
注意:有人会说这应该是sizeof *test
(或sizeof(char)
)。他们是错的(在我客观正确的意见;注意讽刺)! TYPE *p = malloc(x * sizeof *p)
保证为1,因此这种乘法是不必要的。
有些人主张使用sizeof *p
,以便在TYPE发生变化时,您只需要在一个地方进行更改,char *
就会适应。我是其中一个人,但在我看来,您很少需要将char *
升级为其他类型。由于这么多函数使用malloc
并且需要在这样的升级中进行更改,因此我并不担心使{{1}}行更灵活。
答案 1 :(得分:3)
sprintf()
不为字符串分配空间;你必须事先自己做。
答案 2 :(得分:2)
看看你的警告:
test.c: In function ‘main’:
test.c:8: warning: ‘test[0]’ is used uninitialized in this function
您分配了一个包含8个指针的数组,但在没有初始化的情况下使用一个指针。您必须调用malloc
并将结果存储在test[0]
中,然后才能写入test[0]
指向的内存。你最后free
。
GNU和BSD中有用的函数是asprintf
,它将调用malloc
为您分配足够的格式化字符串内存:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int num = 1;
char* test[8];
asprintf(&test[0],"%d",num);
printf("%s\n",test[0]);
free(test[0]);
return 0;
}
(请注意,您将指针的地址传递给asprintf
- 因为您的指针为test[0]
,其地址为&test[0]
。)
答案 3 :(得分:-1)
你确实分配了空间但是你传递了错误的东西。试试这个:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int num = 1;
char test[8];
sprintf(test,"%d",num);
printf("%s\n",test);
}
答案 4 :(得分:-3)
int main()
{
char *str[5];
sprintf(str[0], "%d",55);
printf("%s\n",str[0]);
return 0;
}
这将是有效的。但是,如果指定变量而不是整数常量值,则会发生分段错误。此错误将在sprintf函数执行时发生。因为用户空间内存访问。