并不是什么新鲜的事情,不过值得注意。
首先我们知道,在使用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. 网络协议 HTTP入门学习

    概述 Web 的诞生,源于三大技术的诞生,它们都是当年 Web 之父 Tim Berners-Lee 自己 开发的,世界上第一个网站诞生的时间是 1991 年,三大技术的诞生也就是在此之前的不久: 1 ...

  2. 12C数据库ORA-40365: The SYS user cannot be locked while the password file is in its current format

    [环境介绍] 系统环境:Solaris + Oracle 12CR2   [背景描述] 基于集团数据库安全检查项,需要把sys用户锁定或者修改复杂口令整改. 在整改前已经对参数remote_login ...

  3. .net aop 操作 切面应用 Castle.Windsor框架 spring 可根据接口 自动生成一个空的实现接口的类

    通过unget 安装Castle.Windsor using Castle.DynamicProxy; using System; using System.Collections.Generic; ...

  4. git add . 提示 `Changes not staged for commit`

  5. 关于ElementUI中MessageBox弹框的取消键盘触发事件(enter,esc)关闭弹窗(执行事件)的解决方法

    好久没见了 在项目中遇到一个小小的需求,总结了一下! 详细我就不介绍了,相信大家用过的话,很了解.详见文档-----------> http://element-cn.eleme.io/#/zh ...

  6. js变量类型和计算

    # js入门基础-变量类型和计算 ` --首先由于我使用了一个不太合格的markdown来编写来文章,所以在移动端阅读不要太方便,建议移动端使用横屏模式或pc端阅读,当然如果你有平板那是最好的. -- ...

  7. C# - 设计模式 - 模板模式

    模板模式 问题场景 咖啡和茶派生于抽象类饮料,咖啡和茶都具有烧水的方法,所以可以将烧水的方法提取到抽象类饮料中去实现,而咖啡具有一个向杯子加咖啡粉的方法,茶具有一个向杯子加茶叶的方法,看起来两个方法是 ...

  8. centos7.6设置sftp服务

    sftp是Secure File Transfer Protocol的缩写,安全文件传送协议. CentOS自带 SSH 服务,直接配置即可 1. 查看ssh版本 sftp是基于ssh协议的,首先查看 ...

  9. docker-compose部署ELK

    本章基于 https://www.cnblogs.com/lirunzhou/p/10550675.html 在此基础上将ELK系统docker-compose.yml化. 其docker-compo ...

  10. habse Region server挂掉

    2019-04-28 15:57:28,355 INFO org.apache.hadoop.hbase.regionserver.HeapMemoryManager: heapOccupancyPe ...