C语言指针 | 价值$90亿的教训
合集 · 一口气入门C语言 (25)
-
先导片 | 如何只用3小时入门C语言...
2:52
-
在你开始编程之前 | 为什么安装C编译器和VS Code
1:51
-
C语言环境设置 | Windows安装编译器和VS Code
5:40
-
C语言环境设置 | macOS安装编译器和VS Code
2:43
-
C语言的基本结构 | 你必须熟练的让人心疼
6:05
-
C语言printf | 谁是世界上最好看的人
6:42
-
C语言转义符 | 救命!打印不出双引号
4:50
-
C语言变量 | 你的私房钱到底有多少
7:18
-
C语言命名规则 | 什么是好名字
3:02
-
4分钟带你学会二进制
4:10
-
C语言数据类型(上) | 谁点的-1.11杯啤酒
9:19
-
C语言数据类型(下)| 人人都是1米高
6:28
-
C语言数学运算 | 遥遥领先的计算器
8:08
-
C语言常量 | 守护我的每周搬砖时长
4:15
-
C语言注释 | 悄悄在代码里骂用户?
2:22
-
C语言条件语句(上) | 又被流量扣费坑了?
5:58
-
C语言条件语句(中) | 又双叒被流量扣费坑了?
7:39
-
C语言条件语句(下) | 你要去几楼?
8:30
-
C语言逻辑运算符 | 今天会被鸽吗?
4:47
-
C语言scanf | 你的角色名是啥?
7:18
-
C语言while循环 | 硬币啥时候才抛出正面?
7:31
-
C语言for循环 | 你要打印几份?
7:32
-
C语言数组 | 找出体测不合格的脆皮同学
10:01
-
C语言字符串 | 代码世界的糖葫芦串
9:54
-
C语言指针 | 价值$90亿的教训
6:07
Description
了解下C语言的灵魂组成部分——指针 它也是造成2024年大规模蓝屏事件的罪魁祸首
Comments
为什么说C/C++接近底层的语言,个人认为指针就是一个体现。 指针几乎能指任何东西,这使得其非常灵活,当然也就引出了C/C++程序员的一大要求——良好的内存管理习惯。由于指针经常会和malloc和new等连用用来申请动态内存,由于C/C++运行时默认没有内置和java一样的垃圾回收机制和内存池的管理,使用指针时很容易产生问题。常见的如空指针,野指针和内存泄露。 空指针:即指针变量指向0x00,一般此处不被认为有效数据,一般的指针变量初始化都会选定这里,但是一旦解引用就会出现错误数据。因此引出第一个使用指针习惯是解引用前确定其已指向有效数据。 野指针:即指针指向未知内存,一旦对其或者修改可能会导致其他数据错误(严重的可能会修改重要系统数据,但是现代的操作系统一般会阻止应用程序这样做,当然内核或者驱动程序就不一定了)所以使用指针的第二个习惯就是声明时置空,然后遵循空指针的使用。(其实建议声明所以变量时都附上初值,放置读出无效数据) 内存泄露:在申请动态内存时没有释放,但是没用指向其地址的指针(即指向其地址的指针被销毁了)。这就导致程序在运行时会申请越来越多的内存,徒增内存占用。这个问题如果发生在服务器上就会很麻烦甚至致命(想想一台服务器每次处理一次访问就产生一点内存泄露,那要是访问多了,很快就把内存吃满了)解决方法就在声明指针的作用域里释放掉,声明一个释放一个。或者使用C++中的智能指针来管理动态内存。
♥ 229 ↩ 9
把握住两点,就不会被指针绕晕: 1.指针就是地址; 2.指针变量就是存储地址的变量。 uint8_t*a如何去理解?把(uint8_t* a)看成这样,它的含义是什么?a是一个存储“uint8_t类型数据地址”的变量,它的对齐方式为1个字节,a++就是地址增加1个字节。如果是u16类型数据,a++的话,你猜它的地址是加几呢?[doge]个人理解,如有错误,立马删评。
♥ 153 ↩ 34
弱弱的问问:为什么不直接用变量,要去用指针呢,C/C++ 代码里经常看到这个星号
♥ 45 ↩ 34
C语言中更建议把*和变量名称连在一起写,例如:int *iPtr; 意为对iPtr解引用后的内容(即*Ptr),是int类型。也就意味着iPtr是int指针变量。
♥ 43 ↩ 8
这个空指针是个问题,但是这个应该不算关键问题。纯粹的编程问题一般都有各种测试制度,上线制度,进行测试约束。一般都会尽量提前发现问题,或缩小范围影响。 理论上来说,现在很多系统都隐藏着未发现的空指针bug,但是这些bug按照正常使用很难或几乎不可能触发。而那次问题是bug触发条件太简单了,明显就是测试和发布机制有问题。 之前有人解说过,他们公司的上线制度好像有问题,连灰度测试都没有。[吃瓜]
♥ 17 ↩ 1
唉明明指针是个很好用的东西,但C语言偏偏就要搞*&这种不明所以的符号,哪怕增加个像violate、const这样的保留词呢。我每次都容易搞混哪个是取地址哪个是取数据,反人类的设计
♥ 15 ↩ 6
所以说了半天都没讲到底是什么造成了蓝屏? 白白浪费五分钟
♥ 14 ↩ 9
其实在定义指针时的命令(以int* ptr;为例)可以写成int *ptr;(因为编译器不看空格),前一种可以理解成声明了一个int*(整型指针)类型的变量ptr,而后一种则可以理解成声明了一个整型变量*ptr,这个整型变量由解除引用运算符("*")和"ptr"组成,对"ptr"解除引用的数据是一个整型,那么"ptr"自然可以被理解成一个整型指针。 需要注意的是int* p1,p2命令会把p1声明为指针而p2声明为整型变量,所以我个人觉得第二种解释应该比较靠谱,因为相比于创建一堆新的变量声明关键字,一个解除引用运算符明显更省事[吃瓜],不过用哪个纯看个人心情了
♥ 13 ↩ 10
为了修改变量的值:1)对变量的指针赋值,2)直接重新赋值变量,这两种是不是完全相同的操作?如果是,现实中有什么情况会选择用1)而不是2)这种更直观的方法呢?
♥ 11 ↩ 6
为什么一个指针也要🈶变量类型,不就是一个类似软链接的东西。c语言忘完了[doge]
♥ 11 ↩ 12
别太迷信语言,很多项目跟风上rust只会把自己玩死,连上线犯错的机会都没有。
♥ 10 ↩ 2
锟斤拷,烫烫烫!
♥ 8
打了几个比喻,如果不对,还请指正
♥ 6 ↩ 2
关于指针难点, 都在乱讲. 指针语法不难, 看不懂语法就翻下书, 几遍就懂了. 指针真正难点是指向地址的生命周期. 举个例子, 去银行填表格要写住址(指针), 是写你现在暂住的宾馆地址呢?还是你家地址? 前者显然不对,因为生命周期太短,过几天银行通过这个地址可能找不到你,而是别人. 后者看起来正确, 其实也有风险, 要是拆迁搬家了呢?
♥ 5 ↩ 1
int *pointer=new int:申请一块int大小的内存
♥ 5
NullPointerException @林粒粒呀
♥ 5
up主其实讲的不完全,指针的难点有很多,比如说数组指针,直接拿着数组名进行计算,该数组会退化为指向首个元素的首地址的指针,除此之外还有指针数组,函数指针,void类型指针,野指针和悬空指针,多级指针等等,同时还要考虑指针的数据类型,因为指针的数据类型会直接影响到指针的步长。
♥ 4 ↩ 1
经常访问空指针、数组溢出、内存泄露,都是小项目,问题不大
♥ 4
未初始化的指针不知道他指向哪里,那么遇到那些乱指挥的导师或者领导岂不是可以用 person *leader or person *teacher来内涵[吃瓜]
♥ 3