从结构内的void指针访问结构的成员

时间:2014-04-20 05:22:04

标签: c

我想从结构中的void指针访问结构的成员,我已经尝试了以下代码,但它提供了错误"在'('token"之前的预期标识符。我应该更改什么printf声明?先谢谢。

#include "stdio.h"
struct
{
    int date;
    char *name;
}test;

struct
{
    void *check;
}massage;

main()
{
    test.date=21;
    test.name="Nilesh";
    massage.check =&test;
    printf("date - %d , name - %s\n",massage.((struct test *)check)->date,massage.((struct test *)check)->name);
}

3 个答案:

答案 0 :(得分:3)

struct  // anonymous struct type 
{
    int date;
    char *name;
} test;

上面的语句定义了一个匿名结构类型,并创建了一个没有名称的结构类型的变量test。类似地,下面的语句定义了一个匿名结构类型,并创建了这种类型的变量massage -

struct  // anonymous struct type
{
    void *check;
} massage;

类型转换运算符必须在括号(type)中有一个类型,而不是变量名。因此,您必须为第一个struct提供名称(标记)以便使用类型转换运算符。 此外,类型转换运算符的结果是r-value,因此它不能与成员选择.(dot)运算符一起使用(它应该是成员的名称)。因此,应该在从结构中获取值之后应用类型转换运算符。因此,以下表达式是错误的 -

massage.((struct foo *)check)->date
//      |____________________|
//                |
//       this should be the member name but it
//       evaluates to a r-value - the result of
//       the typecast operator assuming struct tag
//       is foo

// it should instead be
((struct foo *)massage.check)->date
// dot operator has higher precedence than typecast
// so the struct member check is fetched first and 
// it is typecast to type (struct foo *)

我建议进行以下更改 -

// standard headers should be 
// enclosed in angle < > brackets
#include <stdio.h>

// give the structure a name so it can be 
// used in typecasting
struct foo {  
    int date;
    char *name;
} test;

// anonymous struct type
struct {
    void *check;
} massage;

// return type of main should be int and 
// parameter list should contain void
int main(void) {
    test.date = 21;
    test.name = "Nilesh";
    massage.check = &test;

    // fetch the struct member check and then 
    // apply typecast operator
    printf("date - %d , name - %s\n", ((struct foo *)massage.check)->date, 
                                      ((struct foo *)massage.check)->name);
    return 0;
}

答案 1 :(得分:2)

在你的表达中:

massage.((struct test *)check)->date
//               ^^^ is variable not a data-type 

有两个错误:

  1. 你不能在一个变量中输入case,在你的代码中test是一个变量而不是一个类型,所以(struct test *)是错误的表达式。您应该命名用户定义的类型(正如我在下面建议的那样)。

  2. 您正在应用类型转换而不访问massage的指针成员。所以在表达式(struct test *)check中,实际上“check”是未知变量。编译器会报错“check”是未声明的变量(思想test不是数据类型,但应用类型转换的顺序在概念上是错误的。)

  3. 我建议进行一些纠正尝试:

    1. 将结构命名为例如newtype

       struct newtype  // notice I given name to user defined datatype
       {
          int date;
          char *name;
       }test;
      
    2. 然后在printf函数中更正第二个和第三个参数,如下所示

        ((struct newtype *)massage.check)->date
       // ^^^^^^^^^^^^^^ notice  
      
    3. 类似于printf中的第三个参数。首先访问成员然后键入强制转换为正确的类型

      有关完整代码,请参阅Ajay的answer

答案 2 :(得分:0)

结构定义不是您想要的 - 它定义了一个未命名的结构类型的对象测试。试试

struct testType
{
    int date;
    char *name;
} test;

然后转换为(testType *)。