当前位置: 首页 > news >正文

C语言经典错误总结(三)

一.指针与数组理解

 我们都知道定义一个数组然后对其进行各种想要的操作,但是你真的能够区分那些是对数组的操作,那些是通过指针实现的吗?

例如;arr[1]=10;这个是纯粹对数组操作实现的吗?

答案肯定不是,实际上我们定义一个数组之后只能做两件事:

1.确定数组的大小

2.获得一个指向该数组下标为0的元素指针

其他的操作本质上都是通过指针来实现的

为什么我要将这个呢?因为如果你能够理解这个,那么你就会明确的知道下面这个结论:

任何一个数组下标运算都等同于一个对应的指针运算

讲到这里,我们有必要重新讲解下对数组名的理解:

数组名就是数组⾸元素(第⼀个元素)的地址是对的,但是有两个例外:
1.sizeof(数组名),sizeof中单独放数组名,这⾥的数组名表⽰整个数组,计算的是整个数组的⼤⼩,
单位是字节
2.&数组名,这⾥的数组名表⽰整个数组,取出的是整个数组的地址(整个数组的地址和数组⾸元素的地址是有区别的)
除此之外,任何地⽅使⽤数组名,数组名都表⽰⾸元素的地址。
关于指针的常见错误如下:
假如我们现在要定义两个指针指向对应的位置,我们的代码可能如下:
int* fast=NULL, slow=NULL;

但是你会发现在使用时,fast是指针,而slow却只是一个int型整数,原因就在于这里定义你写错了,正确的如下:

int* fast=NULL, *slow=NULL//注意slow前面加*

指针常见错误二:

如果两个指针fast 和 slow不指向同一个数组中(同一个连续的空间),是不能够进行相减操作的

给大家看一个案例,大家可以找找有几处错误:
#include <stdio.h>
#include <string.h>
int main()
{char arr1 = "hello";char arr2 = "world";char* pc = malloc(strlen(arr1) + strlen(arr2));//操作//……//结束return 0;
}

下面看我说的对不对:

1.用到malloc一定要检查空间大小,如果接下来我要进行strcat或者strcpy等操作,你确定开辟的空间够用吗?‘\0'我放在哪呢?所以,第一个问题就是malloc开辟空间不够大,我们应该开辟:

char* pc = malloc(strlen(arr1) + strlen(arr2)+1);

2.一个动态开辟的内存,你确定一定开辟成功?所以我们开辟后一定要检查:

char* pc = malloc(strlen(arr1) + strlen(arr2)+1);
if (pc == NULL)
{return -1;
}

3.指针有没有问题呢?你如果用完了指针,你是不是要归还给系统呢?

//结束
free(pc);
pc = NULL;

因此,正确代码如下:

#include <stdio.h>
#include <string.h>
int main()
{char arr1 = "hello";char arr2 = "world";char* pc = malloc(strlen(arr1) + strlen(arr2)+1);if (pc == NULL){return -1;}//操作//……//结束free(pc);pc = NULL;return 0;
}

关于指针还有一个易错点:
复制指针并不会复制指针所指向的数据
下面我们来深入理解下这句话:
假如现在我定义一个数组:int arr[3]={1,2,3};
再定义一个指针:int  p1=arr;
代码如下:
int arr[3]={1,2,3};
int* p1=arr

如果现在我们在:

int arr[3]={1,2,3};
int* p1=arr;
int* p2=p1;

现在是不是p1和p2都指向数组首元素了,如果我再:

int arr[3]={1,2,3};
int* p1=arr;
int* p2=p1;
p2[1]=5;

此时我想问p1[1]=?是不是也是5,没错,这就表明,新开辟p2指针是没有复制数据的,而是直接和p1指向同一块空间,明白这个有利于我们加深对指针底层理解!

指针和数组可以说是C语言重点了,希望大家能够对它们彻底学透。

二.边界计算和不对称边界

#include <stdio.h>
int main()
{int i = 0;int arr[] = { 1,2,3,4,5,6,7,8,9,10 };for (i; i <= 12; i++){arr[i] = 0;printf("hello world\n");}return 0;
}

看这个代码,结果大家都知道,就是会陷入死循环,现在我为什么要提出这个简单问题呢?假如你写的i<=12改成i<=10,如果编译器检查不严格,也可能代码陷入死循环的状态,接下来我们就慢慢来告诉大家如何能够避免这种错误代码(即循环次数问题)。

现在假如我有100米长的围栏需要每10米立一根栏杆,请问我要买几根?

对于这个问题,大家肯定会不假思索的答出:11根

现在我们回到元素上,请问:16<=x<=37,满足条件的整数有多少?是20?21?还是22?

我想如果你对此不熟悉的话,可能需要一番思索,然后才会回答:22

现在我们有这样一个方法来快速的判断元素个数:

如果我们将16<=x<=37转换为;16<=x<38,这个你会发现:38-16=22,即为结果

这个对于编程有啥关系呢?你可能会问


首先这种不对称关系被称为:不对称边界,在数组中,该边界中的上界(大的边界)即为元素个数,这样可以非常简洁的表示而不会出错。

对比下面代码:

#include <stdio.h>
int main()
{int arr[10] = { 0 };for (int i = 0; i <= 9; i++){arr[i] = i;}return 0;
}
#include <stdio.h>
int main()
{int arr[10] = { 0 };for (int i = 0; i <10; i++){arr[i] = i;}return 0;
}

将i<=9改成i<10,这样看起来可能不美观,但是可以非常有效帮助到你,如果你对此还感兴趣,可以去了解缓冲区知识,那里运用不对称边界又是美妙的体会。

这一部分主要讲述不对称边界书写问题,希望对大家有帮助。
本文章参考《C陷阱与缺陷》,欢迎大家自己阅读,体会里面的奇妙,最后感谢大家的支持,希望大家不断完善自己缺漏,弥补不足!

相关文章:

C语言经典错误总结(三)

一.指针与数组理解 我们都知道定义一个数组然后对其进行各种想要的操作&#xff0c;但是你真的能够区分那些是对数组的操作&#xff0c;那些是通过指针实现的吗&#xff1f; 例如;arr[1]10;这个是纯粹对数组操作实现的吗&#xff1f; 答案肯定不是&#xff0c;实际上我们定义…...

Ubuntu系统入门指南:基础操作和使用

Ubuntu系统的基础操作和使用 一、引言二、安装Ubuntu系统三、Ubuntu系统的基础操作3.1、界面介绍3.2、应用程序的安装和卸载3.3、文件管理3.4、系统设置 四、Ubuntu系统的日常使用4.1、使用软件中心4.2、浏览器的使用和网络连接设置4.3、邮件客户端的配置和使用4.4、文件备份和…...

MyBatis原理解读

我们项目中多用MyBatis进行数据库的读写,开源的MyBatis-Plus框架对其进行了增强,使用上更加简单,我们之前的很多项目也是直接用的MyBatis-Plus。 数据库操作的时候,简单的单表读写,我们可以直接在方法里链式组装SQL,复杂的SQL或涉及多表联合join的,需要在xml手写SQL语句…...

Linux---文本搜索命令

1. grep命令的使用 命令说明grep文本搜索 grep命令效果图: 2. grep命令选项的使用 命令选项说明-i忽略大小写-n显示匹配行号-v显示不包含匹配文本的所有行 -i命令选项效果图: -n命令选项效果图: -v命令选项效果图: 3. grep命令结合正则表达式的使用 正则表达式说明^以指…...

Unity中Shader语义的理解

前言 以下内容主要是个人理解&#xff0c;如有错误&#xff0c;欢迎严厉批评指正。 一、语义的形式在Shader中是必要的吗&#xff1f; 不是必要的。 使用HLSL和CG语言来编写Shader需要语义&#xff0c;使用GLSL编写Shader不需要。 二、语义的意义&#xff1f; 语义是什么&…...

Flink系列之:Top-N

Flink系列之&#xff1a;Top-N 一、TOP-N二、无排名输出优化 一、TOP-N 适用于流、批Top-N 查询可以根据指定列排序后获得前 N 个最小或最大值。最小值和最大值集都被认为是Top-N查询。在需要从批表或流表中仅显示 N 个底部或 N 个顶部记录时&#xff0c;Top-N 查询是非常有用…...

CSS的三大特性(层叠性、继承性、优先级---------很重要)

CSS 有三个非常重要的三个特性&#xff1a;层叠性、继承性、优先级。 层叠性 场景&#xff1a;相同选择器给设置相同的样式&#xff0c;此时一个样式就会覆盖&#xff08;层叠&#xff09;另一个冲突的样式。层叠性主要解决样式冲突 的问题 原则&#xff1a;  样式冲突&am…...

飞天使-docker知识点10-docker总结

文章目录 docker 知识点汇总docker chatgpt解释学习路线cmd和 ENTRYPOINT 的区别harbor安装漏洞扫描 docker 知识点汇总 docker 基础用法 docker 镜像基础用法 docker 容器网络 docker 存储卷 dockerfile docker仓库 harbor docker-compose docker chatgpt解释学习路线 学习…...

旅游管理虚拟情景实训教学系统演示

首先&#xff0c;虚拟情景实训教学系统为旅游管理专业的学生提供了一个全新的实践平台。在传统的旅游管理教学中&#xff0c;学生往往只能通过理论学习来了解相关知识&#xff0c;而无法亲身实践。虚拟情景实训教学系统则可以通过模拟真实的旅游场景&#xff0c;让学生能够亲身…...

Linux Shell——输入输出命令详解

Shell 输入输出 1. read2. echo3. printf 总结 最近学习了shell相关语法&#xff0c;顺便总结一下关于shell的输入输出命令read和echo、printf。 1. read shell的输入命令&#xff0c;可以从标准控制台中读取一行&#xff0c;并把输入行中的每个字段赋值给指定的变量 可以看到…...

MFC 第一个窗口程序

目录 一、新建Windows桌面应用程序&#xff0c;空项目 二、修改项目属性 三、编写程序 一、新建Windows桌面应用程序&#xff0c;空项目 创建MFCBase.cpp&#xff0c;整个项目很干净 二、修改项目属性 使用多字节编码 使用MFC库 三、编写程序 需要包含 afxwin.h 文件&…...

SQL语句的执行顺序怎么理解?

SQL语句的执行顺序怎么理解&#xff1f; 我们常常会被SQL其书写顺序和执行顺序之间的差异所迷惑。理解这两者的区别&#xff0c;对于编写高效、可靠的SQL代码至关重要。今天&#xff0c;让我们用一些生动的例子和场景来深入探讨SQL的执行顺序。 一、书写顺序 VS 执行顺序 SQ…...

js解析.shp文件

效果图 原理与源码 本文采用的是shapefile.js工具 这里是他的npm地址 https://www.npmjs.com/package/shapefile 这是他的unpkg地址&#xff0c;可以点开查看源码 https://unpkg.com/shapefile0.6.6/dist/shapefile.js 这个最关键的核心问题是如何用这个工具&#xff0c;网上…...

关于“Python”的核心知识点整理大全25

目录 10.3.4 else 代码块、 10.3.5 处理 FileNotFoundError 异常 alice.py 在这个示例中&#xff0c;try代码块引发FileNotFoundError异常&#xff0c;因此Python找出与该错误匹配的 except代码块&#xff0c;并运行其中的代码。最终的结果是显示一条友好的错误消息&#x…...

代码随想录刷题题Day15

刷题的第十五天&#xff0c;希望自己能够不断坚持下去&#xff0c;迎来蜕变。&#x1f600;&#x1f600;&#x1f600; 刷题语言&#xff1a;C Day15 任务 ● 513.找树左下角的值 ● 112. 路径总和 113.路径总和ii ● 106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历…...

软件设计师——信息安全(一)

&#x1f4d1;前言 本文主要是【信息安全】——软件设计师——信息安全的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304…...

git必须掌握:git远程变动怎么解决

如何已经指定了选择分支 那下面的分支名称可以省略 如果远程分支存在变动&#xff0c;通常 git 推送的流程如下&#xff1a; 首先&#xff0c;使用 git fetch 命令从远程仓库获取最新的分支信息和变动。 git fetch然后&#xff0c;可以使用 git merge 或者 git rebase 命令进…...

Python里的时间模块

time 模块 时间表示方式 时间戳 timestamp:表示的是从 1970 年1月1日 00:00:00 开始按秒计算的偏移量UTC(Coordinated Universal Time, 世界协调时)亦即格林威治天文时间,世界标准时间。在中国为 UTC+8 DST(Daylight Saving Time) 即夏令时;结构化时间(struct_time): …...

SCI一区级 | Matlab实现GWO-CNN-GRU-selfAttention多变量多步时间序列预测

SCI一区级 | Matlab实现GWO-CNN-GRU-selfAttention多变量多步时间序列预测 目录 SCI一区级 | Matlab实现GWO-CNN-GRU-selfAttention多变量多步时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现GWO-CNN-GRU-selfAttention灰狼算法优化卷积门控循环…...

C#学习相关系列之自定义遍历器

在C#中&#xff0c;自定义遍历器需要实现IEnumerable接口和IEnumerator接口。其中&#xff0c;IEnumerable接口包含一个GetEnumerator方法&#xff0c;该方法返回一个IEnumerator接口的实例&#xff0c;而IEnumerator接口包含Current、MoveNext和Reset方法。 IEnumerable&#…...

WPS没保存关闭了怎么恢复数据?3个方法,完成数据恢复!

“我今天在使用WPS时&#xff0c;突然有点急事出去了一趟&#xff0c;但是我忘记保存文档了&#xff0c;回来之后发现电脑自动关机了&#xff0c;我的文档也没了&#xff01;这可怎么办呢&#xff1f;有什么办法可以找回这些数据吗&#xff1f;” 在快节奏的工作中&#xff0c;…...

数据结构和算法-最小生成树(prim和krusakal)和最短路径问题(BFS和dijkastra和floyd)

文章目录 最小生成树总览生成树广度优先生成树深度优先生成树最小生成树Prim算法Kruskal算法Prim vs KrusakalPrim的实现Kruskal的实现 小结 最短路径问题单源最短路径问题BFS求无权图的单源最短路径小结Dijkastra算法算法时间复杂度不适用情况 每一对顶点的最短路径问题Floyd算…...

响应者链概述

响应者链 iOS事件的3大类型 Touch Events(触摸事件)Motion Events(运动事件&#xff0c;比如重力感应和摇一摇等)Remote Events(远程事件&#xff0c;比如用耳机上得按键来控制手机) 触摸事件 处理触摸事件的两个步骤 寻找事件的最佳响应者事件的响应在响应链中的传递 寻…...

ShenYu网关Http服务探活解析

文章目录 网关端服务探活admin端服务探活 Shenyu HTTP服务探活是一种用于检测HTTP服务是否正常运行的机制。它通过建立Socket连接来判断服务是否可用。当服务不可用时&#xff0c;将服务从可用列表中移除。 网关端服务探活 以divide插件为例&#xff0c;看下divide插件是如何获…...

基于dockerfile搭建LNMP

组件自定义IP所需组件nginx172.111.0.10nginxwordpressmysql172.111.0.20mysql-5.7.20php172.111.0.30php LNMP介绍 L&#xff1a;Linux平台&#xff0c;操作系统&#xff0c;另外桑组件的运行平台 N&#xff1a;nginx 提供前端页面 M&#xff1a;MySQL&#xff0c;开源关系的…...

基于VGG-16+Android+Python的智能车辆驾驶行为分析—深度学习算法应用(含全部工程源码)+数据集+模型(三)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 模型构建3. 模型训练及保存1&#xff09;模型训练2&#xff09;模型保存 4. 模型生成1&#xff09;模型导入及调用2&#xff09;相关代码&#xff08;1&#xff09;布局文件&#xff08;2&#xff…...

springMVC-@RequestMapping

基本介绍 RequestMapping注解可以指定控制器/处理器的某个方法的请求的url, 示例 &#xff08;结合springMVC基本原理理解&#xff09; Controller public class UserHandler {RequestMapping(value "/login")public String login() {System.out.println("登…...

智能优化算法应用:基于树种算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于树种算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于树种算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.树种算法4.实验参数设定5.算法结果6.参考文献7.MA…...

web前端项目-影视网站开发

影视网站 本项目主要使用到了 HTML&#xff1b;CSS&#xff1b;JavaScript脚本技术&#xff1b;AJAX无刷新技术&#xff1b;jQuery等技术实现了动态影视网页 运行效果&#xff1a; 一&#xff1a;index.html <!DOCTYPE> <html lang"en"> <head>…...

QT:Unable to create a debugging engine.

debug跑不了&#xff1a; 报错&#xff1a;Unable to create a debugging engine. 参考&#xff1a; https://blog.csdn.net/u010906468/article/details/104716198 先检查是否安装了DEBUG插件 工具-》》选项 查看插件&#xff0c;如果没有的话&#xff0c;需要重新安装qt时…...

有做学业水平测试的网站/网站怎么营销推广

Ubuntu server下搭建Maven私服Nexus Maven私服Nexus的作用&#xff0c;主要是为了节省资源&#xff0c;在内部作为maven开发资源共享服务器来使用。 1、下载 通过root用户进去Ubuntu server $  cd /opt $  wget http://download.sonatype.com/nexus/oss/nexus-2.10.0-02-bu…...

芜湖做网站/怎么在百度制作自己的网站

using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace 回调函数Demo {/* 回调函数的作用&#xff0c;1.分装;2.异步;3.扩展具体方法。* 通过一个委托给出实现功能模块扫遵循的协议&#xff1a;参数和返回类型&#xff0c;而这个委…...

yfcmf做网站/百度平台电话多少

以Oracle用户登录服务器&#xff0c;命令行中输入dbca,弹出数据库配置助手窗口&#xff0c;如下图: 点击"Next"按钮&#xff0c;进入下一步: 选择“Create a Database”创建数据库&#xff0c;并点击"Next"按钮进入下一步: 选择"Custome Database&quo…...

网站建设 招标/优化课程

3、索引与切片 3.1 一维数组 import numpy as nparr1 np.arange(10) print(原始数组,arr1) print(取单独的一个数据) print(arr1[0]) print(arr1[-1]) print(取多个数据) print(arr1[0:-1]) print(arr1[0:3:2])注意点&#xff1a; 1、取单个数据&#xff0c;取下标&#xff…...

网站建设合同 包括什么/seo优化对网店的推广的作用为

2019年春季学期第八周作业 12课程名称c语言程序设计2作业要求https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/3074我的课程目标能够使用字符串函数与指针进行灵活的结合这个作业在哪个方面帮助我实现目标指针与数组及自定义函数结合实现成绩…...

做外贸登录国外网站/整站优化的公司

最近想要练习一下莫队&#xff08;实在是掌握的太不熟练了啊。&#xff09;这题一开始看到有点懵&#xff08;题面杀&#xff09;&#xff0c;后来发现是要求众数的个数。乍一看好像很难的样子。 但仔细分析一下&#xff1a;首先往序列当中加入一个数&#xff0c;这个是很简单的…...