簡體   English   中英

將 char 指針轉換為 int 指針是如何工作的?

[英]How casting of char pointer to int pointer works?

我正在學習 C。當我在那里查看指針時,我注意到一些我無法理解的奇怪行為。 將字符指針轉換為整數指針時,整數指針保存一些奇怪的值,與 char 或 char ascii 代碼沒有合理關聯。 但是在使用 '%c' 打印鑄造變量時,它會打印正確的字符值。

用 '%d' 打印會給出一些未知數字。

printf("%d", *pt); // prints as unknown integer value that too changes for every run

但是當打印為 '%c' 時

printf("%c", *pt); // prints correct casted char value

整個程序:

int main() {

char f = 'a';
int *pt = (int *)&f;

printf("%d\n", *pt);
printf("%c\n", *pt);

return 0;
}

請解釋 char 到 int 指針轉換的工作原理並解釋輸出值。

編輯:

如果我對程序進行以下更改,則輸出將符合預期。 也請解釋一下。

#include <stdio.h>

int main() {

char f = 'a';
int *pt = (int *)&f;

printf("%d\n", *pt);
printf("%c\n", *pt);

int val = (int)f;
printf("%d\n", val);
printf("%c", val);
return 0;
}

輸出:

97
a
97
a

也請解釋這種行為。

對於 C 語言指定的內容,這只是簡單的未定義行為。 您有一個char大小的內存區域,從中讀取int 結果是不確定的。

至於可能發生的事情:C 運行時最終會在main執行之前在堆棧上傾倒一些隨機垃圾。 char f = 'a'; 碰巧將垃圾的一個字節重寫為已知值,但是對齊pt的填充意味着根本不會重寫剩余的字節,並且其中包含“運行時留下的任何內容”。 因此,當您讀取int時,在小端系統上,低字節等於'a'的值,但高字節是填充空間中碰巧留下的任何垃圾。

至於為什么%c有效,因為低字節還是一樣,而%c只檢查提供的int的低字節,所有的垃圾都被忽略了,事情發生了如預期的那樣。 不過,這只適用於小端機器; 在大端機器上,字節將被初始化為'a' ,但低字節(垃圾)將由%c打印。

您已將f定義為char 這通常會在大多數硬件中分配 1 字節的存儲空間。 您獲取f的地址,將其轉換為 (int *) 並將其分配給 int * 變量 pt。 整數的大小取決於底層硬件 - 它可能是 2 或 4 甚至更多。 FPT的分配地址,也被分配到PT地址取決於多種因素,如int大小和對齊要求。 這就是為什么當您打印*pt 時,您會看到一個垃圾值。 實際上, 'a'的 ASCII 值包含在垃圾中,其位置取決於 int 大小、硬件字節序等。如果使用%x打印*pt ,您將在輸出中看到 61 (61十六進制是十進制的 97)。

<#include <stdio.h>
int main()
{

    //type casting in pointers

    int a = 500; //value is assgned
    int *p;   //pointer p
    p = &a;   //stores the address in the pointer
    printf("p=%d\n*p=%d", p, *p);
    printf("\np+1=%d\n*(p+1)=%d", p + 1, *(p + 1));

    char *p0;
    p0 = (char *)p;
    printf("\n\np0=%d\n*p0=%d", p0, *p0);

    return 0;
}

暫無
暫無

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

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