强制转换 void 指针地址的含义

问题描述 投票:0回答:1

最近,在使用 C 语言工作时,我正在开发一个通用函数。 这是结构布局:

typedef struct student_{
    char name[32];
    int roll_no;
    unsigned int height;
} student_t;

下面是我的功能。该函数所做的就是将给定的结构实例与键之一进行比较(因此是通用的)。这里的关键是roll_no

static int
check_student_by_roll_number(void *data,void *key){
    student_t * student = (student_t*) data;
    unsigned int roll_no = *(unsigned int*)(key); // Getting segmentation fault here
    if(student->roll_no == roll_no)return 0;
    return -1;
}

但是同样的故障码,当我写为

unsigned int roll_no = *(unsigned int*)(&key);

我将该函数称为

check_student_by_roll_number(john,(void*)40); // john is a pointer to valid structure 

分段错误消失了,代码工作正常。那么两者之间有什么区别

*(unsigned int*)(key)
*(unsigned int*)(&key)

c pointers segmentation-fault void-pointers
1个回答
2
投票

在这种情况下,

key
被视为某种整数类型。
key
不包含指针,因此取消引用它显然是错误的。

要从

40
返回
(void*)40
,您需要
(int)(void*)40

您也可以直接投射到

unsigned int
,这就是您想要的。

unsigned int roll_no = (unsigned int)key;

一般来说,将整数值存储在预期保存指针的变量中是不安全的。但在 x86 或 x86-64 上没有问题(只要指针足够大来存储整数)。

© www.soinside.com 2019 - 2024. All rights reserved.