在“内存”中狂浪的C语言

一、狂浪的土壤:

1 .数组

数组的本质就是连续排列的一串数据,就像买票排队和按编号找寄存柜一样,因为人多、柜多(数据量大),有时难免弄错编号,比如会有人插队,或者跑去开别人的柜子,这种非法入侵在计算机中称之为"访问非法内存"。

C语言本着自由开放的理念,并不禁止程序访问非法内存,但后果难料。比如你兴冲冲跑去打开美女的柜子,却飞出条眼镜蛇。

2 .指针

指针可以随便在内存中乱指,因此被视为极度危险份子。一不小心,就可能导致程序崩溃或者更糟糕的情况,如数据损坏。

其实数组本质上也是指针,因为数组名本身就是一个指针,只不过数组指向的是以数组名为首地址的一段连续内存地址。

二、避免狂浪的方法

1 .数组

对于数组,主要有两种避免访问非法内存的方法:

(1) 提前检查:确保不越界

就是在访问数组前检查下标是否合法。缺点很明显,程序会变得繁琐,效率降低。

要检查数组下标,就要经常用到sizeof小哥,它用来返回一个变量或数组实际占用内存的字节数。可以用下面的代码求出一个名为array的数组的大小:

sizeof(array)/sizeof(array0); //整个数组占的字节数除以一个元素的字节数

注意,虽然sizeof长得像个函数,却并不是函数。

那它是啥子呢?

它居然是,居然是"运算符"!

而且,它的值是在编译时获得的,而不是在运行时获得。

这种提前检查的方法在系统函数中也有用到,比如fgets函数就是凭借这一技能将gets淘汰的。

(2) 把肚子搞大:预留余量

就是适当把数组定义得大一些。缺点也很明显,占用内存多。但是如今地主家普遍不差钱,差的是时间,所以只要内存够用,开大一点没关系,因此方案2优于方案1,咱们在算法竞赛中一般都是采用这种方式。

2 .指针

对于指针,没有特别有效的方法。或许,最有力的方法就是不使用它。因此,在很多编程语言都舍弃了指针,就连好兄弟C++也是提倡用引用来代替指针。

然而,从另一方面讲,这种直接访问硬件内存的能力其实正是C语言的一大优点,因为它提供了底层编程的灵活性。正所谓水能载舟,亦能覆舟。真正的C程序员从不回避指针,而是能好好驾驭它,使之成为如六脉神剑一样无坚不摧的神技。

相关推荐
caimouse5 小时前
ReactOS 图形系统分析(16):字符串对象 — STROBJ(string.c)
c语言·开发语言
Aphelios3805 小时前
一次锁内网络IO引发的Tomcat线程池“饿死”事故
java·开发语言·spring boot·elasticsearch·tomcat·网络io阻塞·线程池耗尽
不可求~5 小时前
C++ std::string_view 不是字符串:从悬空引用到安全用法
java·开发语言·c++
90后小陈老师6 小时前
PHP 配置默认值失效排查实录:isset 兜底遇上表单空串回填,首页文案是怎么集体消失的
开发语言·php
JJJennie7777 小时前
Gemini 3.7 Flash 上线,Google 想让 AI 多干活
开发语言·javascript·ecmascript
wuyk5558 小时前
Python 第三章:列表 List
服务器·开发语言·python
Evand J8 小时前
【MATLAB例程,车联网7】CACC网联车辆协同控制:ACC对比、V2X时延丢包与队列稳定性,附例程下载链接
开发语言·matlab·车联网
要努力点9 小时前
Python入门第六课
开发语言·python
Fa_Mian_Tuan9 小时前
图论基础|邻接矩阵超详细讲解(含无向/有向/带权图+完整可运行C语言代码)
c语言·数据结构·笔记·算法·图论
萧瑟余晖9 小时前
Java深入解析篇三十三之消息队列
java·开发语言