从无符号int到char指针的类型转换中出现分段错误

时间:2019-08-21 15:38:30

标签: c pointers casting char int

我是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);
        }

}

2 个答案:

答案 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类型,以保证足以容纳该地址。