我有一个非常简单的C程序。主要是,我有这个操作:
int main(){
int theNumber = 9009;
printf("%s", (char *)theNumber);
}
当我运行它时,它给了我一个seg错误。知道为什么吗?我做错了吗?
此代码应将theNumber
转换为字符串,然后将其打印出来。所以输出将是:
9009
分段错误。
答案 0 :(得分:3)
这是试图打印在地址9009
找到的任何内容。由于操作系统没有让您的程序访问此地址(它可能完全用于其他操作),操作系统会引发分段错误。在此处阅读更多内容:What is a segmentation fault?
如果您真的只想打印整数的值,请使用正确的printf命令:
int main(){
int theNumber = 9009;
printf("%d", theNumber);
}
请注意,您无需在此处引入字符串即可实现此目的。
答案 1 :(得分:3)
好。让我们首先谈谈C语言中的字符串。从根本上说,它是一个字符指针char *
到内存中存储空终止字符系列的位置。
这方面的一个例子是:
char *str = malloc(3);
str[0] = 'h';
str[1] = 'i';
str[2] = '\0';
str
现在包含字符串"hi"
。
您正在执行的类型转换采用整数9009,并将其转换为char *
。然后,由于您将该指针用作字符串,意味着您告诉计算机在地址9009处,存在空终止的字节序列。
这可能不是真的,除非你使用的是专用硬件,否则肯定不是你想要的。
我们有一个相当简单的机制,可以通过snprintf()
将printf-able数据转换为字符串。
首先,我们需要为结果字符串分配内存。这是C与其他语言的共同区别。在C中,您非常了解数据的内存要求。
char str[100];
int size_used = snprintf(str, 100, "%d", 9009);
assert(size_used < 100);
现在,如果size_used >= 100
,那么我们就遇到了问题。我们的记忆区域溢出。 snprintf()
将尽可能多地写出字符,但在这种情况下不会写入null终止零。
答案 2 :(得分:0)
因为这不是对char的int的转换。它是指向char的指针的int。基本上,指针是一个保存内存地址的变量。当您尝试打印该值为9009的指针时,该函数将访问该地址的内存,这可能是被禁止的,因此您将获得段错误。
为了避免这种情况,你应该使用itoa函数之类的东西(注意它不是标准的,所以你可能必须自己实现它。)