[英]memcpy unsigned int to unsigned char segmentation fault
[英]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.