簡體   English   中英

當我將一個字符串分配給一個字符時會發生什么?

[英]What happens when I assign a string to a char?

我寫:

char ch = "ABC";

現在,當我編譯它時,我沒有收到任何錯誤。 但是,如果我嘗試單獨顯示這些字符或一次顯示整個字符串,我就不能這樣做,因為每當我嘗試這樣做時,我的程序就會崩潰。

這個程序中發生了什么?

通常應該發生的事情(至少在相當現代的編譯器中)是您收到一條錯誤消息,因為如果沒有顯式轉換,所涉及的轉換不應該發生。

但是,讓我們考慮一下當/如果我們確實強迫編譯器做骯臟的事情時會發生什么,可以這么說。 讓我們考慮一個程序,它包含強制轉換的強制轉換,執行其他一些事情,使真正發生的事情變得更加清晰(我認為)。

#include <stdio.h>

int main() {
    char const *s = "ABC";

    int i = (int)s;
    unsigned char c = (unsigned char)s; 

    printf("%p\n%8x\n%8x\n", s, i, c);
}

(我使用unsigned char而不是char只是為了防止在碰巧設置了指針的第 7 位時對值進行符號擴展)。

我從中得到的輸出如下所示:

0x4005f4
  4005f4
      f4

所以這里發生的事情是"ABC"是一個字符串文字,我們可以使用它來初始化(以及其他可能性)指向(const)char的指針。 如果我們將其轉換為指向 void 的指針,我們可以看到存儲該字符串文字的地址(注意:如果您編譯它,您獲得的地址可能會有所不同)。

如果我們將該地址轉換為無符號整數,我們會得到相同的值。 標准不能保證這一點,但在大多數典型情況下,這幾乎是您可能會看到的。

最后,我們將指針轉換為char 以十六進制打印出來,我們可以很容易地看到它只保留了地址的 8 個最低有效位。 同樣,標准不能保證它正好是 8 位,但它是char的一個非常典型的大小。

免責聲明:雖然您可能會看到與我所展示的結果相似的結果,但幾乎沒有任何保證。 支持打印出指向 void 的指針,但將使用的確切格式取決於編譯器/庫。 同樣,不能完全保證轉換為整數類型的結果——但在大多數典型的計算機/編譯器實現中,您可以期望看到與我上面顯示的結果類似的結果。

底線:分配給char值通常是分配用於存儲字符串文字的地址的最低有效 8 位(這基本上是無用的)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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