当前位置: 首页 > 知识库问答 >
问题:

linux - 结构体嵌套情况下,C语言void*类型赋值失败?

焦学海
2023-06-09

具体是这样的,我定义了两个个结构体:

typedef struct
{
    void* input;
    void* output;
} A;

typedef struct
{
    char* data1;
    int* data2;
} B;

在使用的时候做了如下操作

A* test;
test->input = (B*)(test->input);
test->output = (B*)(test->output);

test->input->data1 = "hello";
*(test->input->data2) = 1;

其中最后两句给data1和data2赋值的语句编译报错(ubuntu上的gcc),报错说data1、data2 in something not a struct or union
改成下列语句后编译通过了

A* test;
B* tmp1;

tmp1->data1 = "hello";
*(tmp1->data2) = 1;

test->input = tmp1;

想问为什么第一种写法不会通过?
另外想问下面这个写法能够通过编译吗?

A* test;
B* tmp1 = (B*)(test->input);
tmp1->data1 = "hello";

共有1个答案

王宏深
2023-06-09

test->input 是 void* 。它不能用 ->

test->input = (B*)(...) 会把右侧的 B* 的指针转换为 void* 赋值给左侧。C++ 里变量的类型是不能改变的。test->input 依然是 void*void* 不能使用 ->

最后一个写法是可以的,因为 tmp1B*


以上仅讨论编译时的问题。这些写法在运行时几乎都有内存问题。

 类似资料:
  • 主要内容:结构体变量,成员的获取和赋值前面的教程中我们讲解了 数组(Array),它是一组具有相同类型的数据的集合。但在实际的编程过程中,我们往往还需要一组类型不同的数据,例如对于学生信息登记表,姓名为字符串,学号为整数,年龄为整数,所在的学习小组为字符,成绩为小数,因为数据类型不同,显然不能用一个数组来存放。 在C语言中,可以使用 结构体(Struct)来存放一组不同类型的数据。结构体的定义形式为: struct 结构体名{    

  • 本文向大家介绍C++ 嵌套类/结构,包括了C++ 嵌套类/结构的使用技巧和注意事项,需要的朋友参考一下 示例 甲class或struct还可以包含另一个class/struct内部本身的定义,这被称为“嵌套类”; 在这种情况下,包含类称为“封闭类”。嵌套类定义被认为是封闭类的成员,但在其他方面则是单独的。 从封闭类的外部,可以使用范围运算符访问嵌套类。但是,在封闭类的内部,可以使用没有限定符的嵌套

  • 要想实现一些复杂的功能,依靠简单的分支结构和多重分支结构等等是远远不够的。所以我们还需要分支嵌套结构。 1. 分支嵌套结构的语法 if (条件 1) { if (条件 2) { 执行语句 1 } else { 执行语句 2 } } else { if (条件 3) { 执行语句 3

  • 主要内容:获取结构体成员,结构体指针作为函数参数当一个 指针变量指向结构体时,我们就称它为 结构体指针。 C语言结构体指针的定义形式一般为: struct 结构体名 *变量名; 下面是一个定义结构体指针的实例: 也可以在定义结构体的同时定义结构体指针: 注意,结构体变量名和数组名不同,数组名在表达式中会被转换为数组指针,而结构体变量名不会,无论在任何表达式中它表示的都是整个集合本身,要想取得结构体变量的地址,必须在前面加 ,所以给 pstu 赋

  • 所谓 结构体数组,是指数组中的每个元素都是一个结构体。在实际应用中, C语言结构体数组常被用来表示一个拥有相同 数据结构的群体,比如一个班的学生、一个车间的职工等。 在C语言中,定义结构体数组和定义结构体变量的方式类似,请看下面的例子: 表示一个班级有5个学生。 结构体数组在定义的同时也可以初始化,例如: 当对数组中全部元素赋值时,也可不给出数组长度,例如: 结构体数组的使用也很简单,例如,获取

  • 我使用键值存储作为我的Go语言应用程序的后端,日期作为键(保持条目排序),json文档作为值。json的顶级命名空间()以及和存在于我存储的每个json文档中,但在其他方面存在一些差异(尤其是关于一些嵌套的json数据),所以当keyI从数据库中提取时,我真的不知道我在循环浏览的任何时间提取了什么。这是json数据的示例 当我从数据库中提取数据时,我要做的第一件事是将每个条目解组到<code>ma