面经1-通信中结构体作为参数传递

原文地址:Socket传输结构体数据注意事项_铭毅天下的博客-CSDN博客

我立刻做了实验,发现确实有上面得问题,结构体作为参数传输时,结构体的成员变量不要出现指针,(使用数组替代,并给足空间)我做的UDP传输实验,通信双方都定义一个 相同类型结构体在进行传输。

struct bufferevent{
  int a;
  char b;
  float c;
  char *d;

};

会报段错误

struct bufferevent{
  int a;
  char b;
  float c;
  char d[10];

};

正常运行

C语言,当你需要在函数内部修改结构体的成员时,通常会选择将整个结构体作为参数传递。这里有几种常见的方法: 1. **值传递(Pass by value)**:这是默认的方式,函数接收到的是结构体的一个副本,对副本的改变不会影响到原结构体。例如: ```c void changeAge(Person p) { p.age = 30; // 这里的改变不会影响到外部的p1 } Person p1; changeAge(p1); printf("p1.age = %d", p1.age); // 输出可能仍然是25 ``` 2. **引用传递(Pass by reference or Pass by address)**:在C语言标准库头文件`<stddef.h>`定义了`offsetof`宏,可以手动实现类似指针的功能,间接达到引用的效果: ```c #include <stddef.h> void changeAgeRef(void *ptr, size_t offset, int new_age) { ((int *)((char *)ptr + offset)) = new_age; // 直接修改结构体内的成员 } // 使用 changeAgeRef(&p1, offsetof(Person, age), 30); ``` 这里的`offsetof`返回给定成员在该类型的起始地址偏移量。 3. **当结构体大小固定且不需要直接修改内部成员时,还可以使用指向结构体首地址的指针(Pass by pointer)**: ```c void changeAgePtr(Person *p) { // 通过指针操作结构体 p->age = 30; } // 调用 Person p1; changeAgePtr(&p1); ``` 这种方法更常见于需要直接修改结构体内容的场景。 注意:C语言本身并不支持指针到成员(pointer to member)的概念,所以对于大型复杂的结构体,可能会使用C++或C11的`offsetof`和`offsetof`特性来简化处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值