C语言结构体存储问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言结构体存储问题相关的知识,希望对你有一定的参考价值。

自定义了一个放有很多参数的结构体struct snmp_seq,变量sp
struct snmp_seq

int get_snmp[BUFFER_SIZE];
int total_length;
int version;//版本号
int community[BUFFER_SIZE];//团体关键字
int command;//PUD类型
int reqid[BUFFER_SIZE];//请求标识
int errstat;//错误状态
int errindex;//错误索引
int pdu_type_start;
int errorstatus_start;
int errorIndex_start;
int oid_value_start;
int varbing_start;
struct variable_list//绑定变量

int oid_name[BUFFER_SIZE];//OID值
int oid_len;//OID长度
int value_type;//变量值的类型
int value_len;//变量值的长度
int oid_value;//变量值的值
val;
sp;

function1(sp, WORK,len,fd);
调用函数,将结构体变量sp带入,对WORK进行处理,将处理的结果在函数function1中,通过sp.xxxx赋值。

如果function1函数结束返回,那结构体struct snmp_seq中的赋值就都会消失,
我如何在function1中开辟存储空间去存储,之后在另一个函数中能对这个存储结构进行调用呢?

你最好重写你的function1,因为你function1(sp, WORK,len,fd);
这样调用函数时参数都是值传递,也就是相当于把sp中的参数值复制了一份给function1使用,函数执行完退出后,这些值的空间也就被释放了,所以sp中的值没有改变。你可以这样写:

typedef struct //绑定变量

int oid_name[BUFFER_SIZE];//OID值
int oid_len;//OID长度
int value_type;//变量值的类型
int value_len;//变量值的长度
int oid_value;//变量值的值
variable_list_t;

typedef struct 

int get_snmp[BUFFER_SIZE];
int total_length;
int version;//版本号
int community[BUFFER_SIZE];//团体关键字
int command;//PUD类型
int reqid[BUFFER_SIZE];//请求标识
int errstat;//错误状态
int errindex;//错误索引
int pdu_type_start;
int errorstatus_start;
int errorIndex_start; 
int oid_value_start;
int varbing_start;
variable_list_t val;
SNMP_t;

void main(void)
    SNMP_t sp;
    function1(&sp, WORK,len,fd);


function1(SNMP_t* snmp, WorkType work, int len, int fd)
    snmp->total_length=work.xxx;
    ...

不知道你能看懂这段代码吗?其实最核心的问题是你要想在函数退出后改变函数参数的值,就必须使用地址传递

参考技术A 直接将结构体设置成变量如
typedef struct

...

snmp_seq;

snmp_seq sp;

然后再function1里直接对变量sp操作,如sp.xxx= xxx;
函数运行完,变量赋值保存;追问

这样也没有对赋值的结构进行保存啊?您能说得再详细点吗?

追答

这个结构体定义的是全局变量,会有保存,function1(WORK,len,fd); 可以不带sp参数

以上是关于C语言结构体存储问题的主要内容,如果未能解决你的问题,请参考以下文章

C语言结构体数组的定义

C语言中结构体在内存中的存储方式?

C语言中结构体的理解

C语言中的结构体,结构体数组

C语言结构体在定义的时候,各成员后面加冒号是啥意思?

大家帮我看下这个C语言结构体分配空间的问题好么~