2015-05-04 139 views
1

我对将结构指针去结构化为 结构变量有点混淆。解引用指向结构变量的结构指针

如果我用一个例子证明我的问题,那将会很好。

所以我在这里:

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

为什么你不能取消引用指针结构?在一个指针中,你不能访问底层对象的地方是什么? –

+0

你的意思是这样的:https://ideone.com/lduzh0? – mch

+2

这里的实际问题是什么?顺便说一句第二个例子是错误的,你尝试printf'struct_ptr.num1',但在第二个例子中没有'struct_ptr'。 –

回答

1

唯一的问题是,你必须保证通过的void*指向正确的结构类型的变量。只要这样做,一切都会正常工作。

问题是你为什么要使用void指针而不是期望的结构,但是我认为这个函数是一些泛型编程设置的一部分,否则使用void指针是没有意义的。

但是,如果你尝试的东西“的hackish”是这样的:

int arr[2] = {100, 150}; 
Display_struct(arr); // BAD 

然后不再有任何保证:上面的代码可以编译得很好,但它调用未定义的行为,因此可能会崩溃&烧伤。该结构可以在任何地方包含填充字节的代码也打破C的"strict aliasing"规则

(别名是指由C标准第6.5章表达式,7§规定的规则)

0

你所想起来没有任何问题。 A struct -type(别名为集合数据类型)在技术上与其他类型没有太大区别。

如果我们看一下底层的东西,任何类型的变量(包括struct类型)都只是内存中的一些位数。

该类型决定变量中的位数及其解释。

实际上,无论您取消引用指针到int还是指向指向struct的指针,只需获取指针所指向的位块即可。

0

在你的主要功能,你有struct tmp_struct。它不是一个指针。但没关系,因为您将tmp_structaddress传递给函数void Display_struct(void * dest_var)

然后函数接受输入参数,你的指针(void *)。它包含'tmp_struct`的地址。

然后在函数内部正确解除引用。

struct_ptr = *((struct my_struct *)dest_var); 

你尊重void*struct my_struct类型。您的引用正确,因为您传递了相同类型的对象。否则它会导致运行时间问题。

无论您的数据类型或数据结构多么复杂,解引用都应该正常工作。

但是,如果输入参数类型为void *请确保通过struct my_struct函数。