结构体中二级指针的赋值和释放

Posted edan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结构体中二级指针的赋值和释放相关的知识,希望对你有一定的参考价值。

背景说明:写项目时,想把数据按照结构体的格式存放,但是数据中有一个字符串数组,也就是二级指针,牵涉到开辟空间和释放的问题,可能是太基础了,查了很久每查到资料,后来自己写出来了。记录以下

心得:见指针就开辟空间,开辟完成后依次对应回收

 

代码:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 
 5 typedef struct data{
 6     int id;
 7     int count;
 8     char **addr;
 9 }Data_t;
10 //创建对象指针
11 int create_data(Data_t **arg,int num)
12 {
13     int i;
14     Data_t *tmp = NULL;
15     tmp = (Data_t *)malloc(sizeof(Data_t));
16     if(tmp == NULL)    
17     {
18         return -1;
19     }
20     tmp->addr = (char **)malloc(sizeof(char *)*num);
21     for(i = 0;i < num;i++)
22     {
23         tmp->addr[i] = malloc(100);//地址大小
24     }
25     *arg = tmp;
26     return 0;
27 }
28 //释放空间
29 int free_data(Data_t **arg,int num)
30 {
31     Data_t *tmp= NULL;
32     tmp = *arg;
33     int i;
34     for(i = 0;i<num;i++)
35     {
36         free(tmp->addr[i]);
37     }
38     free(tmp->addr);
39     free(tmp);
40     *arg = NULL;
41     return 0;
42 }
43 
44 
45 int main(void)
46 {
47     Data_t *data = NULL;
48     int i,num = 2;
49     int result;
50 
51     result = create_data(&data,num);
52     if(result == -1)
53     {
54         printf("func create_data error:%d
",result);
55         return result;
56     }
57     else
58     {
59         data->id = 123456;
60         data->count = 2;
61         
62         for(i = 0;i < data->count;i++)
63         {
64             strcpy(data->addr[i],"Hello");
65         }
66     }
67 
68     printf("%s %s 
",data->addr[0],data->addr[1]);
69     
70     free_data(&data,num);
71     return 0;
72 }

 

以上是关于结构体中二级指针的赋值和释放的主要内容,如果未能解决你的问题,请参考以下文章

C 语言结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )

c 结构体中存在指针,指针的不同赋值方法

结构体中定义结构体怎么赋值

c++指针最全总结(附源码和详细总结)

C 语言二级指针案例 ( 多级指针内存释放问题 | 多级指针避免野指针 )

结构体指针在使用完free后,该指针所指向的内存区域是啥,这个指针是变成了NULL,还是野指针。