为什么可以';sprintf中的第一个参数不能是C中的字符指针
我想把一个整数转换成一个字符串。以下是有效的方法:为什么可以';sprintf中的第一个参数不能是C中的字符指针,c,C,我想把一个整数转换成一个字符串。以下是有效的方法: int main() { int a= 54734; char a_str[10]; sprintf(a_str, "%d", a); printf("%s\n", a_str); return 0; } 但这不起作用: int main() { int a= 54734; char* a_str; sprintf(a_str, &qu
int main() {
int a= 54734;
char a_str[10];
sprintf(a_str, "%d", a);
printf("%s\n", a_str);
return 0;
}
但这不起作用:
int main() {
int a= 54734;
char* a_str;
sprintf(a_str, "%d", a);
printf("%s\n", a_str);
return 0;
}
它返回:
Process finished with exit code 139 (interrupted by signal 11:
SIGSEGV)
我认为字符串以null结尾,所以指向char的指针也应该可以工作。因为我是C语言新手,所以如果我错了,请纠正。首先,需要了解的一件重要事情是,当您的程序试图使用不允许使用的内存时,通常会出现分段错误 其次,您必须了解sprintf正在做什么。调用
sprintf(a_str,“%d”,a)
时,将变量a
的内容移动到a_str
指向的地址处的内存空间。因此,为了不引起分段错误,您的程序必须“拥有”由a_str
指向的内存,然后才能在sprintf
中使用它
当您将char a_str[10]
传递到sprintf
中时,它总是工作的,因为程序已经为a_str
分配了自己的内存空间(带有char a_str[10];
)。因此,当您在其上使用sprintf
时,程序正在访问允许其访问的内存
但是,当您将
char*a_str
传递到sprintf
中时,会导致未定义的行为。当您创建char*a_str
时,您所做的只是创建一个指向内存中某个随机位置的char
指针;您的程序很可能无法访问此随机指针所指向位置的内存。因此,调用sprintf
并尝试将a
的内容移动到其中将抛出分段错误。如果您使用类似于mallocchar*a_str=(char*)malloc(sizeof(char)*21)的东西将char*a_str
指向某个可用内存位置,则可以解决此问题;你需要告诉系统你需要多少内存,这就是计算机的工作方式。另一个注意事项是,因为你的问题标题的措辞:你传递到sprintf
(都char a_str[10]
和char*a_str
)的东西都是“char
指针”。C/C++中的所有数组都是指向该数组中第一项的指针。在某些情况下,数组会衰减为指针,但一般来说,数组和指针并不相同,尽管它们有一些相似之处感谢@qrdl,我过度概括了sprintf
将专门将char[]
视为char*
,因为sprintf
需要char*
,因此数组将隐式转换为指针