取消引用结构变量的struct指针

时间:2015-05-04 08:39:22

标签: c pointers structure

我对将结构指针解析为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指针,因为它是一个简单的数据 类型,但在我看来,我们不能以与结构变量类似的方式取消引用结构指针,因为它不是简单的数据类型,而是复杂的数据类型或数据结构。

请帮我解决背后的概念。

3 个答案:

答案 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传递给函数。