簡體   English   中英

從 unsigned int 到 char 指針的類型轉換中的分段錯誤

[英]Segmentation Fault in typecasting from unsigned int to char pointer

我是 c 的新手。 只是學習。 我想要做的是初始化一個 unsigned int 變量類型,然后在其中存儲一個 char 類型數組的地址,然后我嘗試使用 int 作為指針並使用 unsigned int 打印數組,但我得到分段錯誤,我不知道為什么? 它是char類型數組的內存地址的打印值。 但不是內存地址的實際值。 有人可以幫忙嗎?

#include <stdio.h>

int main()
{
    char char_arr[4] = {'a', 'b', 'c', 'd'};
    int i;

    unsigned int hackyPointer;
    hackyPointer = (unsigned int) char_arr;

    for (i = 0; i < 4; i++)
    {
        printf("[hacky Pointer] now points to %p which contains value %c\n",hackyPointer, *((char *) hackyPointer));
        hackyPointer += sizeof(char);
    }

}

問題是您試圖適應比int可以存儲的更大的數字,也就是說,如果您正在運行x64

在 64 位系統中,指針的大小為 8 個字節,而int通常為 4 個字節。 指針地址像數字一樣工作,因此當您將指針轉換為int ,地址將被截斷。

int回指針,它現在將包含一些不屬於您的程序的其他地址,這可能導致訪問沖突,或者換句話說,分段錯誤。

使用更大的int來保存地址,將其轉換為int指針或使用uintptr_t類型,該類型保證足夠大以保存地址。

你正在嘗試做的是以下

#include <stdio.h>
#include <stdint.h>

int main()
{
    char char_arr[4] = {'a', 'b', 'c', 'd'};
    int i;

    uintptr_t hackyPointer;
    hackyPointer = (uintptr_t) char_arr;

        for (i = 0; i < 4; i++)
        {
            printf("[hacky Pointer] now points to %p which contains value %c\n",( void * )hackyPointer, *((char *) hackyPointer));
            hackyPointer += sizeof(char);
        }
}        

程序輸出是

[hacky Pointer] now points to 0x7ffff86d4224 which contains value a
[hacky Pointer] now points to 0x7ffff86d4225 which contains value b
[hacky Pointer] now points to 0x7ffff86d4226 which contains value c
[hacky Pointer] now points to 0x7ffff86d4227 which contains value d

您必須使用能夠包含指針值的整數類型。

暫無
暫無

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

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