【问题标题】:Segmentation fault when casting int to char in C在 C 中将 int 转换为 char 时出现分段错误
【发布时间】:2014-08-19 02:01:58
【问题描述】:

我有一个非常简单的 C 程序。总的来说,我有这个操作:

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

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

预期输出

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

9009

实际输出

分段错误。

【问题讨论】:

  • 我不认为 9009 是一个有效的地址
  • 我很抱歉没有澄清。 9009 应该是一个 int。
  • 你没有投射到char你正在投射到一个指向char的指针。为什么地址9009 包含一个可以用printf 打印的字符串?
  • 你打算完成什么?
  • 您错过了一个好问题的关键部分。 您期望的输出是什么?

标签: c casting segmentation-fault printf


【解决方案1】:

因为这不是将 int 转换为 char。它是将 int 转换为指向 char 的指针。基本上,指针是一个保存内存地址的变量。当您尝试打印值为 9009 的指针时,该函数会访问该地址处的内存,这可能是被禁止的,因此您会遇到段错误。

为避免这种情况,您应该使用类似itoa 的函数(注意它不是标准的,因此您可能需要自己实现)。

【讨论】:

  • 你会如何在这里使用atoi()
  • 他的意思可能是相反的
  • @Ben:是的,我想是的。
【解决方案2】:

好的。让我们先来谈谈 C 语言中的字符串是什么。从根本上说,它是一个字符指针char *,指向内存中存储以空字符结尾的一系列字符的位置。

这方面的一个例子是:

char *str = malloc(3);
str[0] = 'h';
str[1] = 'i';
str[2] = '\0';

str 现在包含字符串 "hi"

类型转换有什么作用?

您正在进行的类型转换采用整数 9009,并将其转换为 char *。然后,由于您将该指针用作字符串,这意味着您正在告诉计算机在地址 9009 处有一个以 null 结尾的字节序列。

这可能不是真的,除非你使用专门的硬件,否则肯定不是你想要的。

如何将整数转换为字符串

我们有一个相当简单的机制,可以通过snprintf() 将可打印的数据转换为字符串。

首先我们需要为结果字符串分配内存。这是 C 语言与其他语言的共同区别。在 C 中,您非常了解数据的内存需求。

char str[100];
int size_used = snprintf(str, 100, "%d", 9009);
assert(size_used < 100);

现在,如果size_used &gt;= 100,那么我们就有问题了。我们溢出了我们的内存区域。 snprintf() 将写入尽可能多的字符,但在这种情况下不会写入以零结尾的 null。

【讨论】:

  • 谢谢!这正是我需要的解释:)
【解决方案3】:

这是试图打印在地址9009 找到的任何内容。看到操作系统没有让您的程序访问该地址(它可能完全用于其他目的),操作系统会引发分段错误。在这里阅读更多:What is a segmentation fault?

如果您真的只是想打印整数的值,请使用正确的 printf 命令:

int main(){
  int theNumber = 9009;
  printf("%d", theNumber);
}

注意这里不需要引入字符串来实现。

【讨论】:

    猜你喜欢
    • 2021-10-16
    • 2012-02-07
    • 1970-01-01
    • 2014-02-07
    • 2013-08-10
    • 2018-02-10
    • 2010-09-19
    • 1970-01-01
    相关资源
    最近更新 更多