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;
}