我是c的新手。只是学习。 我想做的是初始化一个无符号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);
}
}
答案 0 :(得分:1)
您要尝试的操作如下
#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
您必须使用能够包含指针值的整数类型。
答案 1 :(得分:1)
问题在于,您正在尝试使用大于int
可以存储的数字,也就是说,如果您正在运行x64
。
在64位系统中,指针的大小为8个字节,int
通常为4个字节。指针地址的工作方式类似于数字,因此当您将指针强制转换为int
时,该地址将被截断。
将int
放回指针,它将包含不属于您程序的其他地址,这可能导致访问冲突或换句话说,分段错误。
使用更大的int
来保存地址,将其强制转换为int
指针,或者使用uintptr_t
类型,以保证足以容纳该地址。