Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中将int转换为char时出现分段错误_C_Casting_Segmentation Fault_Printf - Fatal编程技术网

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

在C中将int转换为char时出现分段错误,c,casting,segmentation-fault,printf,C,Casting,Segmentation Fault,Printf,我有一个非常简单的C程序。大体上,我有以下操作: int main(){ int theNumber = 9009; printf("%s", (char *)theNumber); } 当我运行它时,它会给我一个seg故障。知道为什么吗?我做错了吗 预期产量 此代码应将编号转换为字符串,然后打印。因此,输出将是: 9009 char *str = malloc(3); str[0] = 'h'; str[1] = 'i'; str[2] = '\0'; 实际产量 分段错误。,因为

我有一个非常简单的C程序。大体上,我有以下操作:

int main(){
  int theNumber = 9009;
  printf("%s", (char *)theNumber);
}
当我运行它时,它会给我一个seg故障。知道为什么吗?我做错了吗

预期产量 此代码应将编号转换为字符串,然后打印。因此,输出将是:

9009
char *str = malloc(3);
str[0] = 'h';
str[1] = 'i';
str[2] = '\0';
实际产量
分段错误。

,因为这不是int到char的转换。这是一个int到char指针的转换。基本上,指针是一个保存内存地址的变量。当您尝试打印该指针(其值为9009)时,该函数访问该地址的内存,这可能是禁止的,因此您会得到SEGFULT


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

这是尝试打印在地址
9009
中找到的任何内容。由于操作系统不允许您的程序访问此地址(它可能完全用于其他用途),因此操作系统会引发分段错误。请在此处阅读更多信息:

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

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

请注意,您不需要在此处引入字符串即可实现此目的。

好的。让我们从讨论C语言中的字符串开始。基本上,它是一个字符指针
char*
,指向内存中存储以null结尾的字符序列的位置

这方面的一个例子是:

9009
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);
charstr[100];
使用的整数大小=snprintf(str,100,“%d”,9009);
断言(使用的大小小于100);

现在,如果
size\u used>=100
,那么我们就有问题了。我们的内存溢出了
snprintf()
将写入尽可能多的字符,但在这种情况下不会写入以零结尾的空字符。

我认为9009不是一个有效的地址,很抱歉没有说明。9009应该是一个int。您不是在对
char
进行强制转换,而是在对
char
的指针进行强制转换。为什么address
9009
会包含一个可以用
printf
打印的字符串?您打算完成什么?您缺少了一个好问题的关键部分。您期望的输出是什么?在这里您将如何使用
atoi()
?他可能是指reverse@Ben:是的,我想是的。谢谢!这正是我需要的解释:)