将int转换为C中的char时出现分段错误

时间:2014-06-27 20:55:45

标签: c casting segmentation-fault printf

我有一个非常简单的C程序。主要是,我有这个操作:

int main(){
  int theNumber = 9009;
  printf("%s", (char *)theNumber);
}

当我运行它时,它给了我一个seg错误。知道为什么吗?我做错了吗?

预期产出

此代码应将theNumber转换为字符串,然后将其打印出来。所以输出将是:

9009

实际输出

分段错误。

3 个答案:

答案 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函数之类的东西(注意它不是标准的,所以你可能必须自己实现它。)