我对将结构指针解析为a有一点困惑 结构变量。
如果我用一个例子证明我的问题,那将是件好事。
所以我在这里:
struct my_struct{
int num1;
int num2;
}tmp_struct;
void Display_struct(void * dest_var){
struct my_struct struct_ptr;
struct_ptr = *((struct my_struct *)dest_var);
printf("%d\t%d\n",struct_ptr.num1,struct_ptr.num2);
}
int main()
{
tmp_struct.num1 = 100;
tmp_struct.num2 = 150;
Display_struct(&tmp_struct);
return 0;
}
现在,当我运行此示例时,我能够以非常干净的方式编译代码,并且输出也是正确的。
但我无法得到的是,这是一种解除引用结构变量的结构指针的正确方法,就像我们在其他简单的情况下那样做 这样的数据类型:
int example_num;
void Display_struct(void * dest_var){
int example_num_ptr;
example_num_ptr = *((int *)dest_var);
printf("%d\t%d\n",struct_ptr.num1,struct_ptr.num2);
}
int main()
{
example_num = 100;
Display_struct(&example_num);
return 0;
}
这里我们可以取消引用int变量的int指针,因为它是一个简单的数据 类型,但在我看来,我们不能以与结构变量类似的方式取消引用结构指针,因为它不是简单的数据类型,而是复杂的数据类型或数据结构。
请帮我解决背后的概念。
答案 0 :(得分:1)
唯一的问题是你必须保证传递的void*
指向正确结构类型的变量。只要它确实如此,一切都会正常。
问题是你为什么要使用void指针而不是预期的struct,但我认为这个函数是一些通用编程设置的一部分,否则使用void指针是没有意义的。
然而,如果你想尝试这样的“hackish”:
int arr[2] = {100, 150};
Display_struct(arr); // BAD
然后不再有任何保证:上面的代码将编译得很好,但它会调用未定义的行为,因此可能会崩溃&烧伤。结构可以在任何地方包含填充字节,代码也会破坏C的"strict aliasing"规则。
(别名是指C标准第6.5章表达式规定的规则,7§)
答案 1 :(得分:0)
你正在考虑一个没有任何问题的问题。 struct
- 类型(别名为聚合数据类型)在技术上与其他任何类型都没有太大区别。
如果我们查看较低级别的内容,任何类型的变量(包括struct
类型)都只是内存中的一些位。
该类型确定变量中的位数及其解释。
实际上,无论是取消引用指针 - int
还是指针指向 - struct
,您只需获得指针所指向的位块。
答案 2 :(得分:0)
在您的主要功能中,您有struct tmp_struct
。它不是指针。但它很好,因为您将address
tmp_struct
传递给函数void Display_struct(void * dest_var)
。
然后函数接受输入参数,你的指针(void *)。它包含'tmp_struct`的地址。
然后在正确解除引用的函数内部。
struct_ptr = *((struct my_struct *)dest_var);
您尊重void*
到struct my_struct
类型。您的解引用正确,因为您传递了相同类型的对象。否则会导致运行时问题。
无论您的数据类型或数据结构有多复杂,取消引用都应该可以正常工作。
但是如果输入arg类型为void *请确保将struct my_struct
传递给函数。