最近,在使用 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)
在这种情况下,
key
被视为某种整数类型。 key
不包含指针,因此取消引用它显然是错误的。
要从
40
返回 (void*)40
,您需要 (int)(void*)40
。
您也可以直接投射到
unsigned int
,这就是您想要的。
unsigned int roll_no = (unsigned int)key;
一般来说,将整数值存储在预期保存指针的变量中是不安全的。但在 x86 或 x86-64 上没有问题(只要指针足够大来存储整数)。