为什么可以';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
的内容移动到其中将抛出分段错误。如果您使用类似于
malloc

char*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*
,因此数组将隐式转换为指针