我想从结构中的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);
}
答案 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
有两个错误:
你不能在一个变量中输入case,在你的代码中test
是一个变量而不是一个类型,所以(struct test *)
是错误的表达式。您应该命名用户定义的类型(正如我在下面建议的那样)。
您正在应用类型转换而不访问massage
的指针成员。所以在表达式(struct test *)check
中,实际上“check”是未知变量。编译器会报错“check”是未声明的变量(思想test
不是数据类型,但应用类型转换的顺序在概念上是错误的。)
我建议进行一些纠正尝试:
将结构命名为例如newtype
struct newtype // notice I given name to user defined datatype
{
int date;
char *name;
}test;
然后在printf函数中更正第二个和第三个参数,如下所示
((struct newtype *)massage.check)->date
// ^^^^^^^^^^^^^^ notice
类似于printf中的第三个参数。首先访问成员然后键入强制转换为正确的类型
有关完整代码,请参阅Ajay的answer。
答案 2 :(得分:0)
结构定义不是您想要的 - 它定义了一个未命名的结构类型的对象测试。试试
struct testType
{
int date;
char *name;
} test;
然后转换为(testType *)。