簡體   English   中英

在C中將int轉換為char時出現分段錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM