【问题标题】:C pointer to another struct指向另一个结构的 C 指针
【发布时间】:2018-04-25 20:30:30
【问题描述】:

我目前正在阅读一些用于数据包发送的源代码。对于下面的伪代码,对于“packet->packet2 = (char*) data”这一行,它实际上是什么意思?我可以理解为将可变数据中的字符数据类型存储到packet2中,它也被定义为字符数据类型?

struct Node1
{
    char packet1;
    int num1;
}

struct Node2
{
   char *packet2;
   int num2;
}

int main(void)
{
   struct Node1 *data;
   struct Node1 var1;

   struct Node2 *packet;
   struct node2 var2;

   data = &var1;
   packet = &var2;

   packet->packet2 = (char*) data;
}     

【问题讨论】:

  • 这不会编译。修复它。
  • 其实packet变量中没有packet2字段因为是Node1类型
  • 即使编译了,也是完全错误的。您不能将指针放入char
  • 我混合了 Node1 和 Node2 变量,但我已经按照上面的方法修复了它。
  • 你还没有为packet分配内存

标签: c pointers struct embedded


【解决方案1】:

packet2 是 char 类型,您不能将指针放入结构的该字段中。Char 变量不能保存指针。您必须将 packet2 从 char 类型更改为 char* 类型。 这意味着您可以单独使用每个字节,因为取消引用字符指针会给您一个字节。

packet2[0]

将让您访问 var1 结构的第一个字节。 需要注意的是,当你做这样的事情时,你必须非常小心,因为可能会有填充字节。对于这种情况,你可以使用宏 offsetof。

packet->packet2[0] = 5;

将等同于

var1.packet1 = 5;

【讨论】:

  • 我明白了。因此,如果我将 packet2 更改为 char* 类型,“packet->packet2 = (char*) data 行是什么意思?
  • 这意味着 packet2 将指向 struct Node1 *data。 packet2[0] 会给你结构的第一个字节等。但重要的是要注意有填充
【解决方案2】:
struct Node1
{
    Node2*/or Node1*.... packet1;
    int num1;
}

struct Node2
{
   Node1* packet2;
   int num2;
}

int main(void)
{
   struct Node1 *data;
   struct Node1 var1;

   struct Node2 *packet;
   struct Node2 var2;

   data = &var1;
   packet = &var2;

   packet->packet2 =  data;
}     

【讨论】:

    猜你喜欢
    • 2017-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    相关资源
    最近更新 更多