[英]Segmentation fault when casting int to char in C
我有一個非常簡單的C程序。 總的來說,我有這個操作:
int main(){
int theNumber = 9009;
printf("%s", (char *)theNumber);
}
而當我運行它時,它給了我一個段錯誤。 知道為什么嗎? 我做錯了嗎?
此代碼應將theNumber
轉換為字符串,然后打印出來。 因此輸出為:
9009
分段錯誤。
這試圖打印在地址9009
找到的任何內容。 好像操作系統沒有給您的程序訪問此地址的權限(很可能已將其完全用於其他用途),操作系統引發了分段錯誤。 在此處閱讀更多信息: 什么是細分錯誤?
如果您真的只想打印整數值,請使用正確的printf命令:
int main(){
int theNumber = 9009;
printf("%d", theNumber);
}
請注意,您無需在此處引入字符串即可實現此目的。
好的。 讓我們從討論C語言中的字符串開始。 從根本上講,它是一個字符指針char *
,它指向內存中存儲以空終止的一系列字符的位置。
例如:
char *str = malloc(3);
str[0] = 'h';
str[1] = 'i';
str[2] = '\0';
str
現在包含字符串"hi"
。
您正在執行的類型轉換采用整數9009,並將其轉換為char *
。 然后,由於您將該指針用作字符串,表示您正在告訴計算機地址9009處有一個空終止的字節序列。
但是,那可能不是真的,除非您使用的是專用硬件,否則肯定不是您想要的。
我們有一個相當簡單的機制,可以通過snprintf()
將可打印數據轉換為字符串。
首先,我們需要為結果字符串分配內存。 這是C語言與其他語言的共同差異。 在C語言中,您非常了解數據的內存要求。
char str[100];
int size_used = snprintf(str, 100, "%d", 9009);
assert(size_used < 100);
現在,如果size_used >= 100
,那么我們有問題。 我們溢出了內存區域。 snprintf()
會寫入盡可能多的字符,但在這種情況下不會以null結尾零。
因為那不是將int強制轉換為char。 它是將int轉換為指向char的指針。 基本上,指針是保存內存地址的變量。 當您嘗試打印該指針(其值為9009)時,該函數將訪問該地址處的內存,這可能是被禁止的,因此您會遇到段錯誤。
為了避免這種情況,您應該使用類似於itoa函數的功能(請注意,它不是標准功能,因此您可能必須自己實現)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.