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