在C中将int转换为char时出现分段错误
我有一个非常简单的C程序。大体上,我有以下操作:在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'; 实际产量 分段错误。,因为
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
的指针进行强制转换。为什么address9009
会包含一个可以用printf
打印的字符串?您打算完成什么?您缺少了一个好问题的关键部分。您期望的输出是什么?在这里您将如何使用atoi()
?他可能是指reverse@Ben:是的,我想是的。谢谢!这正是我需要的解释:)