静态内存指的是在编译时系统自动给其分配的内存,运行结束后会自动释放;静态内存是在栈中分配的;

动态内存是我们程序员手动分配的内存,正常情况下,程序运行结束后,也不会自动释放,所以为了避免发生未知的错误,我们需要手动释放动态内存;动态内存是在堆分配的;


  • 动态内存分配问题:
#include<stdio.h>
#include<malloc.h>//用于调用malloc()函数
int main()
{
int i=5;
//为变量 i 静态分配了4个字节的内存
int *p=(int *)malloc(4);
//将malloc()函数动态分配的4个字节的内存的地址赋给了指针变量 p
*p=5;
//把‘5’放到了指针变量 p 所储存的地址对应的动态内存单元中
printf("%d",*p);
free(p);
//记住在程序结束处一定要将动态分配的内存释放掉,因为正常情况下,动态分配的内存是不会随程序的结束而自动释放的
//所以为了避免未知的错误,在程序结束处,一定要用free()释放动态内存,一个malloc()对应一个free()
}

运行结果:

5
--------------------------------
Process exited after 6.594 seconds with return value 1
请按任意键继续. . .

1.用到动态内存分配时,需要调用:malloc(int i)函数,该函数储存在头文件<malloc.h>中;malloc()函数只有一个int形参,返回值为【第一个字节的地址】;

2.如图中的(int *)代表将malloc返回的字节地址强制为int *类型,至于为什么一定要强制转换,我的理解是:一个地址,是4个字节,而我们不知道用户使用这段malloc()开辟的空间用来储存什么类型的数据,所以调用malloc()函数是,要对其返回值进行不同类型的强制转换;

3.void* 表示未确定类型的指针,void *可以指向任何类型的数据,更明确的说是指申请内存空间时还不知道用户是用这段空间来存储什么类型的数据(比如是char还是int)所以需要 int*强制转换,说明用来存储int类型数据!

  • 理解动态内存的使用:(代码的目的是将 *p 存的100变为200)
#include<stdio.h>
#include<malloc.h>
void f(int *q)
{
//*p=200; //错
//q=200; //错
//**q=200; //错
*q=200;
//free(q); //错 }
int main()
{
int *p=(int *)malloc(4);
*p=100;
printf("%d\n",*p);
f(p);
printf("%d\n",*p); }

运行结果:

100
200 --------------------------------
Process exited after 1.492 seconds with return value 4
请按任意键继续. . .

1.主函数中指针p 指向了一个动态内存,(*p=10)代表向p指向的动态内存放进了一个“10”;

2.这时printf(*p)自然是p所指向的动态内存中所储存的 “10”

3.流程控制进入子函数f(int *)中,f()先将p所指向的内存数据拷贝给了指针q,此时q也指向了动态内存中所储存的”10“,这时如果想改变动态内存中的数据,只能对*q进行操作,因为在子函数*p并没有定义;

4.也不能直接写”q=20“,因为q是指针,20是int,针型殊途啊;

5.**q更不对了,这种类型是从内向外运算的,q是指针,而*q是变量,而*又只能操作指针类型,所以**q自然属于语法错误;

6.子函数最后也不能free(q),因为我们要printf动态内存中的数据,若free(q),此时q所指向的动态内存被释放掉,再printf(*q)输出的自然是垃圾值(因为此时动态内存中没有手动储存数据)


博主只是一只小菜鸡,若文章有错误或不当之处,请狠狠批评博主          (~ ̄(OO) ̄)ブ

大一C语言学习笔记(8)---指针篇--动态内存是什么?与静态内存有什么区别?怎么使用动态内存,有什么需要注意的地方?的更多相关文章

  1. 大一C语言学习笔记(5)---函数篇-定义函数需要了解注意的地方;定义函数的易错点;详细说明函数的每个组合部分的功能及注意事项

    博主学习C语言是通过B站上的<郝斌C语言自学教程>,对于C语言初学者来说,我认为郝斌真的是在全网C语言学习课程中讲的最全面,到位的一个,这个不是真不是博主我吹他哈,大家可以去B站去看看,C ...

  2. 大一C语言学习笔记(7)---指针篇--什么是指针?什么是指针变量?取地址符“&”的作用是什么?地址运算符“*”的作用是什么,怎么理解两者?

    "指针是C语言的灵魂"这句话一开始我没怎么明白,现在接触了指针,终于知道为什么这么说了,因为....难,真难:下面说一下我对这句话的见解: C语言拥有着其他语言所没有的特性---直 ...

  3. 大一C语言学习笔记(2)---快捷键篇

    大家好,博主呢,是一位刚刚步入大一的软件工程专业的大学生,之所以写博客,是想要与同样刚刚接触程序员一行的朋友们一起讨论,进步,在这里记录我的一些学习笔记及心得,希望通过这些点点滴滴的努力,可以让我们离 ...

  4. 大一C语言学习笔记(9)---指针篇--从”内存的使用“和“流程控制”的角度来理解“指针变量的使用‘

    #深入理解指针变量 举个错误栗子: //以下代码的目的是输出100和1000,但输出结果只有一个100 #include<stdio.h> #include<malloc.h> ...

  5. 大一C语言学习笔记(10)---编程篇--制作简易计算器,支持加,减,乘,除,取余运算,要求 0 bug

    博主自开学初就一直在努力为自己的未来寻找学习方向,学习编程嘛,尽量还是要抱大腿的,所以我就加入了我们学校的智能设备研究所,别的不说,那的学长们看起来是真的很靠谱,学长们的学习氛围也超级浓厚,所以我就打 ...

  6. 大一C语言学习笔记(6)---自省篇--流程控制;break,continue,return间的异同;数组应用到循环语句中需要注意的问题;++i 和 i++的异同等。

    下面是傻瓜博主"曾经"犯过的错和一些心得:        ༼ つ ◕_◕ ༽つ 1.要想流程控制学好,一定要学会化繁为简,举栗子: 三目运算符 (略?略:略)---就是一个数字嘛, ...

  7. 大一C语言学习笔记(11)---编程篇--写一个程序,可以获取从键盘上输入的的三个数,并能够判断是否可以以这三个数字作为边长来构成一个三角形,如果可以的话,输出此三角形的周长及面积,要求 0 bug;

    考核内容: 写一个程序,可以获取从键盘上输入的的三个数,并能够判断是否可以以这三个数字作为边长来构成一个三角形,如果可以的话,输出此三角形的周长及面积: 答案: #include<stdio.h ...

  8. 大一C语言学习笔记(4)---自省篇

    博主"曾经"做过的傻事: #你有的*没打全 #你用/的时候没考虑()是一对的 #printf随后加\n #所有变量只要用,就一定要定义数据类型 #sqrt()代表根号 #inclu ...

  9. 《C语言学习笔记》指针数组及其应用

    C语言中,最灵活但又容易出错的莫过于指针了.而指针数组,是在C中很常见的一个应用.指针数组的意思是说,这个数组存储的所有对象都为指针.除了存储对象为指针,即一个地址外,其它操作和普通数组完全一样. # ...

随机推荐

  1. 微信小程序Canvas添加水印字体,通过setGlobalAlpha设置字体透明度。

    微信小程序自带的设置透明度只有setGlobalAlpha,但是CanvasContext.setGlobalAlpha设置透明度,是全局透明,整张图片都透明了.所以直接使用是不行的. 换种思路实现: ...

  2. 国内首篇云厂商 Serverless 论文入选全球顶会:突发流量下,如何加速容器启动?

    作者 | 王骜 来源 | Serverless 公众号 导读 ​ USENIX ATC (USENIX Annual Technical Conference) 学术会议是计算机系统领域的顶级会议,入 ...

  3. luogu3888 GDOI2014拯救莫里斯 (状压dp)

    题目描述 莫莉斯·乔是圣域里一个叱咤风云的人物,他凭借着自身超强的经济头脑,牢牢控制了圣域的石油市场. 圣域的地图可以看成是一个n*m的矩阵.每个整数坐标点(x , y)表示一座城市\(( 1\le ...

  4. Linux基本命令 和 Regex 正则表达式

    Linux基本命令 和 Regex 正则表达式 Regex 基本语法 常用匹配规则 [aeiouAEIOU] # 从中随机选择一个 [0-9]{4} # 从中选择4个 .* # 匹配任意字符 \w # ...

  5. 《手把手教你》系列技巧篇(三十二)-java+ selenium自动化测试-select 下拉框(详解教程)

    1.简介 在实际自动化测试过程中,我们也避免不了会遇到下拉选择的测试,因此宏哥在这里直接分享和介绍一下,希望小伙伴或者童鞋们在以后工作中遇到可以有所帮助. 2.select 下拉框 2.1Select ...

  6. FastAPI 学习之路(十九)处理错误

    系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...

  7. Redis 基础数据类型重温

    有一天你突然收到一条线上告警:Redis 内存使用率 85%.你吓坏了赶紧先进行扩容然后再去分析 big key.等你进行完这一系列操作之后老板叫你去复盘,期间你们聊到了业务的数据存储在 Redis ...

  8. C11 (GNU Dialect) -std=gnu11 和 -std=c11

    C11 (GNU Dialect) -std=gnu11 和 -std=c11 C11 (GNU Dialect) -std=gnu11 和 -std=c11 用于 IntelliSense 的 C ...

  9. Hive面试题整理(一)

    1.Hive表关联查询,如何解决数据倾斜的问题?(☆☆☆☆☆)   1)倾斜原因:map输出数据按key Hash的分配到reduce中,由于key分布不均匀.业务数据本身的特.建表时考虑不周.等原因 ...

  10. CentOS 压缩解压

    目录 命令 tar gzip.gunzip bzip2.bunzip2 zip.unzip 命令组合 打包:将多个文件合成一个总的文件,这个总的文件通常称为"归档". 压缩:将一个 ...