C 为什么我这里有seg故障?我需要帮助。要将整数放入字符指针数组中吗 #包括 #包括 int main() { int num=1; 字符*测试[8]; sprintf(测试[0],“%d”,num); printf(“%s\n”,测试[0]); }

C 为什么我这里有seg故障?我需要帮助。要将整数放入字符指针数组中吗 #包括 #包括 int main() { int num=1; 字符*测试[8]; sprintf(测试[0],“%d”,num); printf(“%s\n”,测试[0]); },c,C,sprintf()不为字符串分配空间;你必须事先自己做。char*test[8]是一个由8个char*或字符串指针组成的数组,由于你没有指定,它们都被设置为垃圾值。因此,sprintf正试图将数据写入谁知道在哪里 您应该使用char test[8],它分配一个由8个char组成的数组,然后分配sprintf(test,“%d”,num) 更新:如果要使用char*指针,应分配空间: #include <stdio.h> #include <stdlib.h> int m

sprintf()
不为字符串分配空间;你必须事先自己做。

char*test[8]
是一个由8个
char*
或字符串指针组成的数组,由于你没有指定,它们都被设置为垃圾值。因此,
sprintf
正试图将数据写入谁知道在哪里

您应该使用
char test[8]
,它分配一个由8个
char
组成的数组,然后分配
sprintf(test,“%d”,num)

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

#include <stdio.h>

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

}
如果要使用
char*
指针数组,其工作原理相同:

char *test = malloc(8 /* see note below */);
sprintf(test, "%d", num);
请记住,您必须通过
test[7]
分别为
test[0]
中的每一个调用
malloc

此外,如注释中所述,如果编译器支持它,则应使用
snprintf()
。它类似于
sprintf
,但它需要一个额外的参数,即缓冲区的大小:

char *test[8]; // 8 pointers to strings
test[0] = malloc(8); // allocate memory for the first pointer
sprintf(test[0], "%d", num);
并保证不会使用超出您允许的空间。它更安全,如果需要,
snprintf
会返回它实际需要的空间量,因此如果空间太小,您可以
realloc
然后重试

注意:有些人会说这应该是
malloc(8*sizeof(char))
(或者
sizeof*test
)。他们错了(在我客观正确的观点中;注意讽刺)
sizeof(char)
保证为1,因此不需要此乘法


一些人主张使用
TYPE*p=malloc(x*sizeof*p)
,这样,如果类型发生变化,您只需要在一个地方进行更改,而
sizeof*p
将适应。我是这些人中的一员,但在我看来,您很少需要将
char*
升级到其他类型。由于如此多的函数使用
char*
,并且在这样的升级中需要进行更改,因此我不担心使
malloc
行更灵活。

您确实分配了空间,但您传递的是错误的东西。试试这个:

snprintf(test, 8, "%d", num);
#包括
#包括
int main()
{
int num=1;
煤焦试验[8];
sprintf(测试,“%d”,num);
printf(“%s\n”,测试);
}
查看您的警告:

test.c:在函数“main”中:

test.c:8:警告:此函数中未初始化地使用了“test[0]”

分配一个由8个指针组成的数组,但使用一个指针时不初始化它。必须调用
malloc
并将结果存储在
test[0]
中,然后才能写入
test[0]
指向的内存。你
free

GNU和BSD中的一个有用函数是
asprintf
,它将调用
malloc
,为格式化字符串分配足够的内存:

#include <stdio.h>

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

}
#包括
#包括
内部主(空){
int num=1;
字符*测试[8];
asprintf(&test[0],“%d”,num);
printf(“%s\n”,测试[0]);
免费(测试[0]);
返回0;
}
(请注意,您将指针的地址传递给
asprintf
——因为指针是
test[0]
,所以它的地址是
&test[0]


这将是工作。但是,如果指定变量而不是整型常量值,则会出现分段错误。此错误将在sprintf函数执行时发生。因为用户空间内存访问。

您尚未为
测试中的指针分配内存,
sprintf
试图写入您无权访问的内存。@Birrree,这应该是答案。:)谢谢大家,我明白了…+1,因为我看到了OP中更可能存在的误解。不,我只想使用指向字符串的指针。。。我希望测试[1]是“1”,测试[2]是2,测试[10]是“10”,就像这样……您应该使用snprintf(test,8,“%d”,num)来防止缓冲区溢出。@Brian L-True,尽管不幸的是,
snprintf
是一个C99函数,并且不是所有编译器都有它(尽管它们应该有)@Andy-更新答案。@Andy:除非您绝对确定需要指针,否则请执行
char test[8][12]
,我仔细选择了“12”,使其足够大,可以容纳任何有符号32位值的十进制字符串表示形式。如果
int
在您的系统上大于32位(这不太可能,但合法),那么我做了一个错误的选择。否。现在,您正在传递一个
char**
,其中应该有一个
char*
asprintf
是有用的,但需要注意的是,它是一个非标准扩展。@Andy,正如jleedev所指出的,它在BSD上可用,包括。在以后的问题中,您可能需要注意您的操作系统。谁将为str[0]分配内存,因为它是指针?这可能不起作用,请检查。这不起作用。您正在分配给一个未初始化的地址。gcc会对此发出警告(两次),并且它会按预期为我设置故障。显然是错的。
#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;
}
int main()
{
       char *str[5];
       sprintf(str[0], "%d",55);
       printf("%s\n",str[0]);
       return 0;
}