繁体   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