为什么我在这里遇到了段故障?需要帮忙.想要将整数放入char指针数组中

Jos*_*son 2 c

#include <stdio.h>

#include <stdlib.h>
int main()
{
    int num = 1;
    char* test[8];
    sprintf(test[0],"%d",num);
    printf("%s\n",test[0]);

}
Run Code Online (Sandbox Code Playgroud)

Chr*_*utz 9

char *test[8]是一个8的数组char *,或指向字符串的指针,由于你没有指定,它们都被设置为垃圾值.所以sprintf试图将数据写入who-know-where.

你应该使用char test[8],它分配一个8的数组char,然后sprintf(test, "%d", num);.

更新:如果你想使用char *指针,你应该分配空间:

char *test = malloc(8 /* see note below */);
sprintf(test, "%d", num);
Run Code Online (Sandbox Code Playgroud)

如果你想使用一个char *指针数组,它的工作原理是一样的:

char *test[8]; // 8 pointers to strings
test[0] = malloc(8); // allocate memory for the first pointer
sprintf(test[0], "%d", num);
Run Code Online (Sandbox Code Playgroud)

请记住,你将不得不调用malloc为每个test[0]通过test[7]独立.

另外,如评论中所述,如果您的编译器支持它,您应该使用它snprintf().它就像是sprintf一个额外的参数,它是缓冲区的大小:

snprintf(test, 8, "%d", num);
Run Code Online (Sandbox Code Playgroud)

并保证不要使用比你允许的空间更多的空间.它更安全,如果你需要,snprintf返回它实际想要的空间量,所以如果你给它太少的空间,你可以realloc再试一次.

注意:有人会说这应该是malloc(8 * sizeof(char))(或sizeof *test).他们是错的(在我客观正确的意见;注意讽刺)!sizeof(char)保证为1,所以这种乘法是不必要的.

有人提倡使用,TYPE *p = malloc(x * sizeof *p)这样如果TYPE改变,你只需要在一个地方改变它,并且sizeof *p会适应.我是这些人之一,但在我看来,你很少需要升级char *到另一种类型.由于这么多功能使用char *并且需要在这样的升级中进行更改,我并不担心malloc线路更灵活.