解引用指向结构变量的结构指针
我对将结构指针去结构化为 结构变量有点混淆。解引用指向结构变量的结构指针
如果我用一个例子证明我的问题,那将会很好。
所以我在这里:
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变量,因为它是一个简单的数据类型,但在我看来,我们不能像结构变量那样以类似的方式取消引用结构指针,因为它不是简单的数据类型,而是复杂的数据类型或数据结构。
请帮我解决这个背后的概念。
唯一的问题是,你必须保证通过的void*
指向正确的结构类型的变量。只要这样做,一切都会正常工作。
问题是你为什么要使用void指针而不是期望的结构,但是我认为这个函数是一些泛型编程设置的一部分,否则使用void指针是没有意义的。
但是,如果你尝试的东西“的hackish”是这样的:
int arr[2] = {100, 150};
Display_struct(arr); // BAD
然后不再有任何保证:上面的代码可以编译得很好,但它调用未定义的行为,因此可能会崩溃&烧伤。该结构可以在任何地方包含填充字节的代码也打破C的"strict aliasing"规则
(别名是指由C标准第6.5章表达式,7§规定的规则)
你所想起来没有任何问题。 A struct
-type(别名为集合数据类型)在技术上与其他类型没有太大区别。
如果我们看一下底层的东西,任何类型的变量(包括struct
类型)都只是内存中的一些位数。
该类型决定变量中的位数及其解释。
实际上,无论您取消引用指针到int
还是指向指向struct
的指针,只需获取指针所指向的位块即可。
在你的主要功能,你有struct tmp_struct
。它不是一个指针。但没关系,因为您将tmp_struct
的address
传递给函数void Display_struct(void * dest_var)
。
然后函数接受输入参数,你的指针(void *)。它包含'tmp_struct`的地址。
然后在函数内部正确解除引用。
struct_ptr = *((struct my_struct *)dest_var);
你尊重void*
到struct my_struct
类型。您的引用正确,因为您传递了相同类型的对象。否则它会导致运行时间问题。
无论您的数据类型或数据结构多么复杂,解引用都应该正常工作。
但是,如果输入参数类型为void *请确保通过struct my_struct
函数。
为什么你不能取消引用指针结构?在一个指针中,你不能访问底层对象的地方是什么? –
你的意思是这样的:https://ideone.com/lduzh0? – mch
这里的实际问题是什么?顺便说一句第二个例子是错误的,你尝试printf'struct_ptr.num1',但在第二个例子中没有'struct_ptr'。 –