并不是什么新鲜的事情,不过值得注意。
首先我们知道,在使用struct来定义并声明一个变量时,将会自动划分出一个连续的储存空间(虽然根据某些对齐原则会出现内存间隙,但是大体上来说还是连续的)
这一块连续空间将会包括结构体中的其他变量所需要的内存。就像这样。
这是一个名为X的结构体变量

而free()函数的作用是对动态分配的内存进行释放,这也就意味着当使用free函数清空一个结构体时,只会清空这个大框里的内存,而不会对a,b,c,d指向的内存进行清理。
当然,一般来说直接定义变量于结构体内会更加方便。
但是考虑一下两种声明

struct stuff{
char home[];
int num;
char name[];
}; struct stuff{
char *home;
int num;
char name[];
};

两者的不同在于,第二种使用的是char指针,所以进行gets(),或者初始化时,*home将会把值储存在常量区。

那么我们考虑一下以下代码
目的是为了查看,在free前后,*home与name的变化

#include <stdio.h>
#include <string.h> struct stuff{
char *home;
int num;
char name[];
}; int main(void){
struct stuff *TOM=(struct stuff *)malloc(sizeof(struct stuff));
TOM->home="LONDON";
TOM->num=;
strcpy(TOM->name,"TOM");
char *p1=TOM->home;
char *p2=TOM->name;
printf("home=%s pointer of home%p name=%s\n",TOM->home,TOM->home,TOM->name);
free(TOM);
printf("home=%s pointer of home%p name=%s\n",p1,p1,p2);
return
}
运行结果:
home=LONDON pointer of home0000000000404000 name=TOM
home=LONDON pointer of home0000000000404000 name=

嗯,我们可以发现home的值仍然保存着,而name的内存被释放。
综上我们可以得出什么结论呢?
free()只能释放指针所指向的那片内存。也就是说,如果我们不断地声明第二种类型的结构体的话,即使调用free()也会造成内存的浪费。最明显的应该是体现在链表类结构。
所以如果要进行插入与删除的操作的话还是考虑第一种结构体靠谱。

2018.10.26
小白刚刚学到结构体,故记之

C语言中free()函数释放struct结构体中的规律的更多相关文章

  1. C语言中typedef,条件编译,结构体的说明

    目录 typedef (类型别名) 条件编译 条件编译在头文件包含中的应用 结构体 使用结构体定义新的结构体变量 结构体成员的引用与赋值 结构体指针及其引用 typedef (类型别名) typede ...

  2. c语言中qsort函数的使用、编程中的一些错误

    qsort()函数: 功能:相当于c++sort,具有快排的功能,复杂度的话nlog(n)注:C中的qsort()采用的是快排算法,C++的sort()则是改进的快排算法.两者的时间复杂度都是nlog ...

  3. C语言结构体中的函数指针

      这篇文章简单的叙述一下函数指针在结构体中的应用,为后面的一系列文章打下基础 本文地址:http://www.cnblogs.com/archimedes/p/function-pointer-in ...

  4. C语言中qsort函数用法

    C语言中qsort函数用法-示例分析    本文实例汇总介绍了C语言中qsort函数用法,包括针对各种数据类型参数的排序,非常具有实用价值非常具有实用价值. 分享给大家供大家参考.C语言中的qsort ...

  5. R语言中apply函数

    前言 刚开始接触R语言时,会听到各种的R语言使用技巧,其中最重要的一条就是不要用循环,效率特别低,要用向量计算代替循环计算. 那么,这是为什么呢?原因在于R的循环操作for和while,都是基于R语言 ...

  6. c语言中的c语言中realloc()函数解析

    c语言中realloc()函数解析 真是有点惭愧,这些内容本应该很早就掌握的,以前只是糊里糊涂的用,不知道在内存中具体是怎么回事,现在才弄清楚. realloc(void *__ptr, size_t ...

  7. C语言中qsort函数的应用

    qsort函数包含在<stdlib.h>的头文件里,本文中排序都是采用的从小到大排序 一.对int类型数组排序 ]; int cmp ( const void *a , const voi ...

  8. C语言中system()函数的用法总结(转)

    system()函数功能强大,很多人用却对它的原理知之甚少先看linux版system函数的源码: #include <sys/types.h> #include <sys/wait ...

  9. 关于c语言中qsort函数的一点心得

    今天写c时无意间用到了排序,便想着使用c语言标准库中提供的排序函数,即qsort函数(c++stl中提供了sort函数用于排序),首先是介绍qsort函数的一些基本用法(以下内容转自: http:// ...

随机推荐

  1. 一个网站SQL注入的案例

    网站的页面提交参数做了md5转换,而且参数会带入两个SQL语句中执行. 注入是肯定存在的,但是SQLMAP怎么都跑不出来(可能原因是其中有个SQL语句总是报错). 尝试手工,发现 order by 报 ...

  2. ASP.NET Web API 2 OData v4教程

    程序数据库格式标准化的开源数据协议 为了增强各种网页应用程序之间的数据兼容性,微软公司启动了一项旨在推广网页程序数据库格式标准化的开源数据协议(OData)计划,于此同时,他们还发 布了一款适用于OD ...

  3. Bootstrap里的Modal框

  4. temp 和 tmp 文件

    TMP和TEMP文件是各种软件或系统产生的临时文件,也就是常说的垃圾文件.Windows产生的临时文件,本质上和虚拟内存没什么两样,只不过临时文件比虚拟内存更具有针对性,单独为某个程序服务而已.而它的 ...

  5. HTML5+CSS3-学习总结

    这是第三次学标签和样式了,虽然距离上次差不多2年.可学过的东西依旧还在. 体会 1.  相对于前端技术,基础还是很重要的. 2.  虽然很繁多.并不是杂乱无章的. 3.  HTML5在新增的几个标签, ...

  6. 【easy】746. Min Cost Climbing Stairs 动态规划

    On a staircase, the i-th step has some non-negative cost cost[i]assigned (0 indexed). Once you pay t ...

  7. FF D8 FF FE 00 24 47 00转图片

    String[] img = "FF D8 FF FE 00 24 47 00 9D 0C 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 F0 0 ...

  8. css制作小标志

    空心箭头:示例图片 <b class="bottom"><i class="bottom-arrow1"></i><i ...

  9. iOS开发之Dictionary与NSData互转

    1.将NSData转换成Dictionary /** 将二进制数据转换成字典*/ + (NSDictionary *)dictionaryForJsonData:(NSData *)jsonData ...

  10. ​Django-model

    Model:数据库操作 创建数据库的表: django不能自动创建数据库,但能创建表 在web的models里定义生成表 在project的settings里设置app定义和数据库信息 步骤: 1.创 ...