C语言编程陷阱 (九)

陷阱41:不要使用内存下标越界

C语言中,集群的下标可能是从0开始的,比如集群的长度是5,那么它的下标范围是0到4,如果我们使用一个超出范围的下标来访问集群,会导致集群下标越界。

有时,我们会错误地使用超出范围的下标来访问磁盘,比如用arr[5]来访问磁盘,这样会导致一些意想不到的结果,甚至引发错误。

错误的代码

#include <stdio.h>int main()
{int arr[5] = {1, 2, 3, 4, 5}; //定义一个数组,长度为5printf("arr[5] = %d\n", arr[5]); //错误地使用数组下标越界return 0;
}

为什么会出错呢?

因为在C语言中,集群下标越界会导致访问一个无效的地址,这样会导致未定义的行为,输出为:

Segmentation fault

这是arr[5]实际上虚拟访问RAIDarr的第6个元素,但是RAIDarr的长度只有5个,所以第6个元素是不存在的,因此会导致访问一个无效的地址,这样会导致未定义的行为,可能会输出一些乱码或者垃圾值,或者直接崩溃。

正确的代码

#include <stdio.h>int main()
{int arr[5] = {1, 2, 3, 4, 5}; //定义一个数组,长度为5printf("arr[0] = %d\n", arr[0]); //正确地使用数组下标printf("arr[4] = %d\n", arr[4]); //正确地使用数组下标return 0;
}

这样就可以正确地使用数据库下标,输出为:

1
5

所以,我们在使用合法集群的时候,要注意使用的下标,避免集群下标越界,否则会导致未定义的行为。

陷阱42:不要在函数调用中使用未初始化的局部变量

C语言中,局部变量在函数内部定义,只在函数内部可见,函数调用结束后会自动释放。如果我们在函数调用中使用未初始化的局部变量,会导致一些异常的结果,甚至引发错误。

错误的代码

#include <stdio.h>int main()
{int a; //定义一个局部变量,但不赋值int b = a; //错误地使用未初始化的局部变量printf("b = %d\n", b); //打印局部变量b的值return 0;
}

为什么会出错呢?

由于在C语言中,未初始化的局部变量的值是未定义的,它可能是任意的值,所以我们不能用它来进行破坏或者判断,这样会导致未定义的行为,输出为:

b = 2147483647

这是因为a的值是未定义的,它可能是任意的值,所以b的值也是未定义的,它可能是任意的值,所以printf("b = %d\n", b);会输出任意的值。

正确的代码

#include <stdio.h>int main()
{int a = 10; //定义一个局部变量,并赋值为10int b = a; //正确地使用初始化的局部变量printf("b = %d\n", b); //打印局部变量b的值return 0;
}

这样就可以正确地使用初始化的局部变量,输出为:

b = 10

所以,我们在使用局部变量时,要注意给它们赋值,而不是使用未初始化的局部变量,否则会造成未定义的行为。

陷阱43:不要使用空指针来访问或修改数据

C语言中,空指针是一个指针,它的值为NULL,表示它不指向任何数据。空指针不能用来访问或修改数据,否则会导致未定义的行为。

错误的代码:

#include <stdio.h>int main() {int *p = NULL;// 错误地使用空指针来访问数据printf("*p = %d\n", *p);// 错误地使用空指针来修改数据*p = 10;return 0;
}

输出:

Segmentation fault

原因:

空指针的值为NULL,表示它不指向任何数据。所以,*p实际上实际上访问了一个不存在的地址,这会导致未执行的行为,可能会输出一些乱码定义或者垃圾值,或者直接崩溃。

正确的代码:

#include <stdio.h>int main() {int *p = NULL;// 正确地检查空指针if (p == NULL) {printf("p is a null pointer\n");} else {// 可以使用指针来访问或修改数据printf("*p = %d\n", *p);*p = 10;}return 0;
}

输出:

p is a null pointer

陷阱44:不要使用未定义的宏

C语言中,我们可以使用宏来定义一个常量或者函数,可以宏让我们简化代码,提高效率。但是,如果我们使用一个未定义的宏,会导致一些严重的结果,甚至引发错误。

错误的代码

#include <stdio.h>#define PI 3.14 //定义一个宏PIint main()
{//使用未定义的宏printf("PI = %f\n", PI);return 0;
}

为什么会出错呢?

因为在C语言中,未定义的宏会被编译器替换为空字符串,所以我们不能用它来进行任何计算或者操作,这样会导致未定义的行为,输出为:

PI = 

这是因为#define PI 3.14实际上相当于#define PI "";,所以PI会被编译器替换为空字符串,这样我们就无法用它来进行任何计算或者操作,这样会导致未定义的行为,可能输出一些乱码或者垃圾值,或者直接崩溃。

正确的代码

#include <stdio.h>#define PI 3.14 //定义一个宏PIint main()
{//正确地使用定义好的宏printf("PI = %f\n", PI);return 0;
}

这样就可以正确地使用定义好的宏,输出为:

PI = 3.14

陷阱45:不要使用空指针

C语言中,空指针是一个指针,它的值为NULL,它表示一个不存在的地址,我们不能用它来访问或者修改任何值。

有时,我们会错误地使用空指针,比如用*p来进行破坏或者判断,这样会导致一些严重的结果,甚至引发错误。

错误的代码

#include <stdio.h>int main()
{int a = 10; //定义一个整数,并赋值为10int *p = NULL; //定义一个空指针printf("a = %d\n", a); //打印a的值printf("*p = %d\n", *p); //错误地使用空指针return 0;
}

为什么会出错呢?

因为在C语言中,空指针的值为NULL,它表示一个不存在的地址,所以我们不能用它来访问或者修改任何值,这样会导致未定义的行为,输出为:

a = 10
Segmentation fault

这是因为*p实际上虚拟访问一个不存在的地址,这个地址可能是无效的,或者是受保护的,或者是已经被其他程序占用的,所以我们不能用它来修改或者任何值,这样会导致未定义的行为,可能会输出一些乱码或者垃圾值,或者直接崩溃。

正确的代码

#include <stdio.h>int main()
{int a = 10; //定义一个整数,并赋值为10int *p = NULL; //定义一个空指针printf("a = %d\n", a); //打印a的值if (p != NULL) //正确地判断空指针{printf("p is not NULL\n");}else{printf("p is NULL\n");}return 0;
}

这样就可以正确地使用空指针,输出为:

a = 10
p is NULL

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/153463.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】基本指令

Linux现在已经是绕不开的操作系统&#xff0c;其开源导致的稳定性&#xff0c;安全性等方面遥遥领先。今天我们开始学习Linux操作系统的基本指令 目录 lspwdcdtouchmkdirrmdir && rmmancp ls 语法&#xff1a; ls [选项][目录或文件] 功能&#xff1a;对于目录&#xf…

NOI1995:石子合并

题目链接 [NOI1995] 石子合并 题目描述 在一个圆形操场的四周摆放 N N N 堆石子&#xff0c;现要将石子有次序地合并成一堆&#xff0c;规定每次只能选相邻的 2 2 2 堆合并成新的一堆&#xff0c;并将新的一堆的石子数&#xff0c;记为该次合并的得分。 试设计出一个算法…

在回调之间共享数据

可以在 App 中为 UI 组件编写回调函数&#xff0c;以指定用户与其交互时的行为方式。 在具有多个相互依赖的 UI 组件的 App 中&#xff0c;回调函数通常必须访问主 App 函数中定义的数据&#xff0c;或与其他回调函数共享数据。例如&#xff0c;如果创建一个具有列表框的 App&a…

关于WhatsApp群发营销价值、类型、优劣势……这里一次性讲清楚

01 社交销售互动&#xff1a;全球营销新趋势 当下&#xff0c;全球品牌的营销销售互动都步入了社交销售新时代&#xff0c;相比原来任何一种形式的互动沟通来说&#xff0c;其沟通效率、体验、效果都是无与伦比的。 企业与销售的互动&#xff0c;与通讯信息技术发展息息相关。…

python数据结构与算法-08_字典

字典 dict 上一章我们介绍了哈希表&#xff0c;其实 python 内置的 dict 就是用哈希表实现的&#xff0c;所以这一章实现 dict 就非常简单了。 当然 cpython 使用的是 c 语言实现的&#xff0c;远比我们写的复杂得多 (cpython/Objects/dictobject.c)。 上一章我们用 python 自…

电容搞搞”振“,PDN有帮衬

高速先生成员--姜杰 聊电容&#xff0c;不能只聊电容&#xff0c;还要聊电阻和电感。看似很简单&#xff0c;其实&#xff0c;一点都不难。 因为去耦电容的模型基本都可以用下面三种元素的简单组合来表示。 理想电容C的阻抗是随频率的增加而逐渐减小的一条斜线&#xff0c;实际…

脱离form表单校验input(校验单个input输入框)提交时边框变红

把需要自定义校验的数据放在一个对象中&#xff0c;方便以后多个字段校验 customVerifyInps:{communityInp2:"",asPathInp:"",}, 在输入框中绑定id <el-inputid"communityInp2"placeholder""v-model"customVerifyInps.commu…

基于STM32设计的(无人)智慧超市-2023改进版

改进的内容: 增加了一个智慧超市登录入口,整个上位机只有一个APP文件。 可以选择顾客或者管理员的身份进去。优化了界面的显示。 一、项目背景 智慧超市是一种新型的零售形式,它将人工智能、物联网、云计算等技术应用到超市运营中,为消费者提供更加便捷、快捷、个性化的购…

IF:9.0+期刊被踢除,11月SCI/SSCI期刊目录已更新!

【SciencePub学术】2023年11月20日&#xff0c;科睿唯安更新了Web of Science核心期刊目录。 继上次SCI期刊目录和SSCI期刊目录更新之后&#xff0c;本次11月更新共有5本期刊发生变动&#xff1a; • SCIE&#xff1a;有5本期刊不再被SCIE期刊目录收录&#xff0c;1本SCIE期刊更…

Flask Web开发:数据库

目录 在虚拟环境中安装Flask-SQLAlchemy&#xff1a; 一、配置 数据库配置示例&#xff1a; 二、定义模型 Role 和 User 模型代码&#xff1a; &#xff08;1&#xff09;常用的 SQLAlchemy 列类型&#xff1a;​编辑 &#xff08;2&#xff09;常用的 SQLAlchemy 列选项…

手撕单链表(C语言)

目录 1.单链表的物理结构 2.头文件的实现 3.SList.c文件的实现 3.1尾插、创建节点 3.2打印 3.3头插 3.4尾删 3.5头删 3.6查找 3.7指定位置之前插入数据 3.8指定位置之后插入数据 3.9删除指定位置节点 3.10删除pos之后的节点 3.11销毁链表 4 所有的代码 1.单链表的物理结构 众所…

Linux删除文件后没有释放空间解决办法

执行下列命令查看处于deleted状态的进程&#xff0c;然后杀掉进程。 lsof | grep deleted注&#xff1a;没有lsof命令的安装一下。 yum install lsof -y

第十篇 基于JSP 技术的网上购书系统——管理员后台管理主界面、订单管理、产品管理功能实现(网上商城、仿淘宝、当当、亚马逊)

目录 1.管理员后台管理——主界面 1.1功能说明 1.2界面设计 1.3处理流程 2.订单管理 2.1功能说明 2.2界面设计 2.3处理流程 2.4数据来源和算法 2.4.1数据来源 2.4.2查询条件 2.4.3表间关系 2.4.4相关sql实例 3.产品管理 3.1功能说明 3.2界面设计 3.3处理流程…

Mybatis系列之 parameterMap 弃用了

我 | 在这里 &#x1f575;️ 读书 | 长沙 ⭐软件工程 ⭐ 本科 &#x1f3e0; 工作 | 广州 ⭐ Java 全栈开发&#xff08;软件工程师&#xff09; &#x1f383; 爱好 | 研究技术、旅游、阅读、运动、喜欢流行歌曲 &#x1f3f7;️ 标签 | 男 自律狂人 目标明确 责任心强 ✈️公…

2023,阿里巴巴走向了中年的十字路口

双十一刚过&#xff0c;各互联网巨头便纷纷对外公布了财报。结合数据来看&#xff0c;虽然行业整体很难重回巅峰&#xff0c;但保持在一个合理的增长区间之内仍是可能的。以阿里为例&#xff0c;在经过持续的整顿调整之后&#xff0c;今年第三季度阿里的“业绩”已有了喜人的变…

【视觉SLAM十四讲学习笔记】第三讲——旋转矩阵

专栏系列文章如下&#xff1a; 【视觉SLAM十四讲学习笔记】第一讲——SLAM介绍 【视觉SLAM十四讲学习笔记】第二讲——初识SLAM 本章将介绍视觉SLAM的基本问题之一&#xff1a;如何描述刚体在三维空间中的运动&#xff1f; 旋转矩阵 点、向量和坐标系 三维空间由3个轴组成&…

担忧CentOS停服?KeyarchOS系统来支撑

担忧CentOS停服&#xff1f;KeyarchOS系统来支撑 近年发生的“微软黑屏门”、“微软操作系统停更”等安全事件&#xff0c;敲响了我国 IT 产业的警钟&#xff0c;建立由我国主导的 IT 产业生态尤为迫切。对此&#xff0c;我国信息技术应用创新行业乘势而起&#xff0c;旨在通过…

给Fetch添加超时功能

引言 在Web开发中&#xff0c;使用Fetch API进行网络请求是一种常见的方式。然而&#xff0c;Fetch API默认不包含超时功能&#xff0c;这可能导致程序在网络不稳定的情况下长时间阻塞。为了解决这个问题&#xff0c;我们可以通过一些技术手段来为Fetch请求添加超时功能&#…

使用大语言模型 LLM 做文本分析

本文主要分享 传统聚类算法 LLM与嵌入算法 嵌入算法聚类 LLM的其他用法 聚类是一种无监督机器学习技术&#xff0c;旨在根据相似的数据点的特征将其分组在一起。使用聚类成簇&#xff0c;有助于解决各种问题&#xff0c;例如客户细分、异常检测和文本分类等。尽管传统的聚…

vue3插槽的使用

什么是插槽 Vue 3 插槽&#xff08;Slots&#xff09;是一个强大的工具&#xff0c;用于在组件之间传递内容和逻辑。通过使用插槽&#xff0c;我们可以将子组件中的内容插入到父组件中的特定位置。本篇文章将总结 Vue 3 插槽的基本用法、特点以及使用场景。 基本用法 插槽分为…