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陷阱与缺陷》,欢迎大家自己阅读,体会里面的奇妙,最后感谢大家的支持,希望大家不断完善自己缺漏,弥补不足!

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

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

相关文章

目标检测YOLO实战应用案例100讲-自动驾驶复杂场景下目标检测(续)

目录 3.2 YOLOv5框架的分析 3.3改进算法的基本思想 3.4改进聚类算法 3.5重构损失函数模型和NMS算法<

HiveSql语法优化四 :Bucket Map Join和Sort Merge Bucket Map Join优化

Bucket Map Join 之前的map join适用场景是大表join小表的情况&#xff0c;但是两张表都相对较大&#xff0c;若采用普通的Map Join算法&#xff0c;则Map端需要较多的内存来缓存数据&#xff0c;当然可以选择为Map段分配更多的内存&#xff0c;来保证任务运行成功。但是&#…

数据可视化---柱状图

import matplotlib.pyplot as plt import numpy as npdef plot_bar_chart(data, labels, colorsNone, title"Bar Chart", xlabel"X-Axis", ylabel"Y-Axis"):"""绘制柱状图&#xff0c;并在柱子上显示数量和比例。:param data: 包…

pytest之allure测试报告03:allure动态自定义报告

1、测试用例模块中引入allure&#xff1a;import allure 2、yaml文件中定义添加title、story的值&#xff1a; 3、测试用例中读取调用。eg:allure.dynamic.title() 4、运行报告查看&#xff1a;成功动态展示yaml文件中配置的story、title

共同编辑文档功能实现(websocket)

目录 前言 websocket封装 wangeditor下载 共同编辑文档代码实现 HTML样式部分 JS部分 css部分 前言 功能&#xff1a;实现文档共同编辑功能&#xff0c;可以实时接收到其他人的信息 思路&#xff1a;先调用接口获取相应的数据进行渲染&#xff0c;然后通过webSocket建…

当 Sealos 遇上区块链

当 Sealos 遇上区块链 拿着区块链技术不一定是去发币&#xff0c;很多业务系统也适合用这些技术&#xff0c;比如做个统一支付系统&#xff0c;积分系统等&#xff0c;可以做为一家公司的金融基础设施&#xff0c;或支付中台。拿链的技术去做有很多好处&#xff1a; 高可用&a…

【图的应用一:最小生成树】- 用 C 语言实现普里姆算法

目录 一、最小生成树 二、普里姆算法的构造过程 三、普里姆算法的实现 一、最小生成树 假设要在 n 个城市之间建立通信联络网&#xff0c;则连通 n 个城市只需要 n - 1 条线路。这时&#xff0c;自然会考虑这样一个问题&#xff0c;如何在最节省经费的前提下建立这个通信…

AUTOSAR汽车电子嵌入式编程精讲300篇-车载CAN总线网关的网络安全协议设计(续)

目录 3.2 网关过滤功能模块设计 3.3 车载网关ID安全等级分类 3.3.1 ID安全等级划分标准

Ansible运行临时命令

Ansible服务的强大之处在于只需要一条命令&#xff0c;便可以操控成千上万台的主机节点&#xff0c;而ansible命令便是最得力的工具之一。前文提到&#xff0c;Ansible服务实际上只是一个框架&#xff0c;能够完成工作的是模块化功能代码。Ansible的常用模块大致有20多个&#…

机器学习之无监督学习

聚类&#xff1a;发掘纵向结构的某种模式信息&#xff0c;某些x属于相同的分布或者类别 特征学习&#xff1a;发掘横向结构的某种模式信息&#xff0c;每一行都可以看成是一种属性或特征 密度估计&#xff1a;发掘底层数据分布&#xff0c;x都是从某个未知分布p(x)采出来的&a…

代码随想录 474. 一和零

题目 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的长度&#xff0c;该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是 y 的元素&#xff0c;集合 x 是集合 y 的 子集 。 示例 1&#xff1a; 输入&#xff1a;strs [“10…

vue实现悬浮窗拖动的自定义指令

首先在自己的项目根目录下建一个 src --> config --> drag.js 然后在main.js中全局引入 //鼠标拖动 import drag from /config/drag; Vue.use(drag); drag.js文件相关代码 import Vue from vue; //使用Vue.directive()定义一个全局指令 //1.参数一&#xff1a;指令的…

(四)STM32 操作 GPIO 点亮 LED灯 / GPIO工作模式

目录 1. STM32 工程模板中的工程目录介绍 2. GPIO 简介 3. GPIO 框图剖析 1&#xff09;保护二极管及上、下拉电阻 2&#xff09; P-MOS 管和 N-MOS 管 3&#xff09;输出数据寄存器 3.1&#xff09;ODR 端口输出数据寄存器 3.2&#xff09;BSRR 端口位设置/清除寄存器 4&a…

实验六 排序相关典型算法实现

一 实验目的 1&#xff0e;熟悉并掌握各种排序方法的设计思路。 2&#xff0e;掌握各种具体排序算法在计算机上的实现。 3&#xff0e;掌握各种排序方法的性能比较。 二 实验内容及要求 实验内容&#xff1a; 1. 编程实现如下功能&#xff1a; &#xff08;1&#xff09…

CGAL的手柄和循环器

1、手柄 CGAL中的大多数数据结构在其用户界面中使用Handles 的概念来引用它们存储的元素。这个概念描述了有时被称为琐碎迭代器的东西。Handle类似于指向对象的指针&#xff0c;提供解引用运算符*&#xff08;&#xff09;和成员访问运算符->&#xff08;&#xff09;&#…

【Java代码审计】目录穿越篇

【Java代码审计】目录穿越篇 1.Java中的目录穿越2.目录穿越漏洞审计3.Java中目录穿越漏洞修复 1.Java中的目录穿越 目录穿越漏洞产生的本质是路径可控&#xff0c;一旦涉及文件的读取问题便会涉及java.io.File类&#xff0c;因此在审计这类漏洞时可以优先查找java.io.File引用…

最强Pose模型RTMO开源 | 基于YOLO架构再设计,9MB+9ms性能完爆YOLO-Pose

实时多人在图像中的姿态估计面临着在速度和精度之间实现平衡的重大挑战。尽管两阶段的上下文方法在图像中人数增加时会减慢速度&#xff0c;但现有的单阶段方法往往无法同时实现高精度和实时性能。 本文介绍了RTMO&#xff0c;这是一个单阶段姿态估计框架&#xff0c;通过在YOL…

超文本传送协议HTTP

目录 HTTP简介&#xff1a; URL的格式&#xff1a; HTTP协议的特点&#xff1a; HTTP/1.0协议&#xff1a; HTTP/1.1协议&#xff1a; HTTP/2: HTTP代理服务器&#xff1a; HTTP的报文结构&#xff1a; 请求报文的特点&#xff1a; 响应报文的特点&#xff1a; Cook…

小 cookie,大作用:探索网站中的隐私追踪器(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

大华 DSS 数字监控系统 itcBulletin SQL 注入漏洞复现

0x01 产品简介 大华 DSS 数字监控系统是大华开发的一款安防视频监控系统,拥有实时监视、云台操作、录像回放、报警处理、设备管理等功能。 0x02 漏洞概述 大华 DSS存在SQL注入漏洞,攻击者 /portal/services/itcBulletin 路由发送特殊构造的数据包,利用报错注入获取数据库…