数组越界死循环

目录

 一、数组越界死循环

二、strcpy函数

三、memcpy函数

四、memmove函数

五、memcmp函数

六、memset函数​


 一、数组越界死循环

数组越界死循环问题(详细,通俗,易懂)_数组加i死循环-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/weixin_55420366/article/details/120394302

//数组随着下标的增长,地址由低到高增长
//栈区的内存,先使用高地址,再开辟低地址
#include<stdio.h>
int main()
{int i = 0;/*数组中的下标从0开始,那么在上面代码中只能访问:a[1]、a[2]、a[3]、a[4]、a[5]、a[6]、a[7]、a[8]、a[9];当i自加到10时,a[10]属于数组下标越界。*/int arr[10] = { 1,2,3,4,5,6,7,8,9 };for (i = 0; i <= 12; i++){arr[i] = 0;printf("hehe\n");}printf("%d\n", i);//12return 0;
}
/*声明一个数组a[5],该数组中只能存放5个元素,下标索引值取值范围0~4,超过这个范围就属于下标越界;*/

         这个程序放到编译器中运行的话会造成死循环,那这时我们可能会想,数组的总元素是10,而循环语句中的i要循环到12才结束,那么肯定会出现数组越界报错啊,但为什么会出现死循环而不是数组越界,并且这个语句为什么会形成死循环呢?下面我来给大家解释。

        首先我们得先从栈开始讲起(不知道什么是栈的小伙伴可以自己去搜),我们平时创建的局部变量就放在栈中,而栈的使用规则从高地址向低地址使用的。并且单个数组元素在栈中的地址相对大小和下标大小相同,也就是说变量i和数组在栈中的位置关系如下图所示。


        那么这就明了了,当数组越界后,i一直++,直到i=12时,此时arr[12]与i,他们俩的地址一样,所代表的的内存空间一样,可以说arr[12]就是i了,此时给arr[12]赋值为0,也就是重新给i赋值为0,那么这个循环会重新开始,也就造成了死循环。

 数组名表示首元素的地址,但是有两个例外:

1.sizeof(数组名),这个数组名表示整个数组

2.&数组名,这个数组名也表示整个数组,取出的是整个数组的地址

int main()
{int arr1[] = { 1,2,3,4,5 };int arr2[] = { 2,3,4,5,6 };int arr3[] = { 3,4,5,6,7 };int* parr[3] = {arr1,arr2,arr3};int i = 0;for (i = 0; i < 3; i++){char j = 0;for (j = 0; j < sizeof(arr1) / sizeof(arr1[0]);j++){/*arr1存放的是其首元素1的地址parr[1]存放的是arr1的地址也就是arr1首元素的地址现在对parr进行解引用实际得到的是arr1首元素的地址arr1首元素的地址存放的是arr1的首元素,解引用得到1*/printf("%d ", *(*(parr + i) + j));if (j == 4){printf("\n");}}}return 0;
}

数组指针:

二、strcpy函数

int main()
{ char name[20] = "xxxxXXxxxx";char name1[20] = "xxxxXXxxxx";char arr[] = { 'a','b','c','i' };strcpy(name, "zhangsan");strcpy(name1, "zhang\0san");printf("%s\n", name);printf("%s\n", name1);strcpy(name, arr);printf("%s\n", name);strcpy(name, "zhangsansssssssssssssssssssssssss");//超出,崩溃return 0;
}

char* my_strcpy(char* parr2, const char* parr1)
{assert(parr1);assert(parr2);char* ret = *parr1;while (*parr2++ = *parr1++);/*parr1++;parr2++;*/*parr2 = '\0';return ret;
}
int main()
{char arr1[] = "abcdef";char arr2[20] = { 0 };my_strcpy(arr2, arr1);printf("%s\n", arr2);}

三、memcpy函数

/*void*类型不能解引用*/
my_memcpy(void* parr2, void* parr1, unsigned int num)
{assert(parr1 && parr2);while (num--){*(char*)parr2 = *(char*)parr1;parr1 = (char*)parr1 + 1;parr2 = (char*)parr2 + 1;}
}
int main()
{int arr1[] = { 1,2,3,4,5,6 };int arr2[20] = { 0 };my_memcpy(arr2,arr1,20);int i = 0;for (i = 0; i < 20; i++){printf("%d ", arr2[i]);}return 0;
}

四、memmove函数

void* my_memmove(void* dst,const void* src,unsigned int num)
{assert(dst && src);void* ret = dst;if (dst < src)//从前向后拷贝{while (num--){*(char*)dst = *(char*)src;dst = (char*)dst + 1;src = (char*)src + 1;}}else if (dst >= src)//从后向前拷贝{while (num--){*((char*)dst + num) = *((char*)src + num);}}return ret;
}
int main()
{int arr1[10] = { 1,2,3,4,5,6,7 };my_memmove(arr1, arr1+3, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}

五、memcmp函数

arr1<arr2,所以返回<0//一个字节一个字节的比较,只要出现小于就会返回

int my_memcmp(const void* parr1, const void* parr2, unsigned int num)
{int ret = 0;while (num--){if (*(char*)parr1 > *(char*)parr2){ret = 1;break;}else if (*(char*)parr1 < *(char*)parr2){ret = -1;break;}else{parr1 = (char*)parr1 + 1;parr2 = (char*)parr2 + 1;}ret = 0;}return ret;
}
int main()
{int arr1[10] = { 1,2,3,4,5,6,7 };int arr2[10] = { 1,2,3,5,6,7,8 };int arr3[10] = { 1,2,3,4,5,6,7 };int arr4[10] = { 1,2,3,2,5,6,7 };int ret1 = my_memcmp((void*)arr1, (void*)arr2, 20);int ret2 = my_memcmp(arr1, arr3, sizeof(arr1) / sizeof(arr1[0]));int ret3 = my_memcmp(arr1, arr4, 20);printf("%d\n%d\n%d\n", ret1,ret2,ret3);return 0;
}


六、memset函数

int main()
{char arr[] = "hello,bit";memset(arr, 'x', 5);printf("%s\n", arr);memset(arr, 0, strlen(arr));int i = 0;for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++){printf("%d ",*(arr+i) );}
}

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

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

相关文章

孜然地址引导页V9(带后台)

刚刚在浏览之前经常访问的网站的时候我发现他不用那个域名了&#xff0c;然后我见这个页面好看&#xff0c;就把他干下来了&#xff0c;然后把给他写了个后台。另外如果你的子页面收录多的话&#xff0c;人家百度访问你的子页面会显示404的&#xff0c;所以为了流量可观安装这个…

百科词条可以删除吗?如何删除自己的百度百科?

近日&#xff0c;小马识途营销顾问接到不少客户删除自己百科词条的咨询&#xff0c;有不少人自己并没有去建立百科词条&#xff0c;但是网上已经有了&#xff0c;有的信息不正确&#xff0c;甚至有的信息是负能量的&#xff0c;对当事人自己造成一定的困扰&#xff0c;所以寻求…

JVM虚拟机系统性学习-运行时数据区(堆)

运行时数据区 JVM 由三部分组成&#xff1a;类加载系统、运行时数据区、执行引擎 下边讲一下运行时数据区中的构成 根据线程的使用情况分为两类&#xff1a; 线程独享&#xff08;此区域不需要垃圾回收&#xff09; 虚拟机栈、本地方法栈、程序计数器 线程共享&#xff08;数…

kali linux无法使用root打开vlc观看视频的解决办法

kali linux陆续装了几个视频播放器&#xff0c;都比较不够友好&#xff0c;无奈安装vlc,vlc安装方法就是 apt install vlc这个没什么好说的&#xff0c;多数源都集成这个著名软件了&#xff0c;kali linux打开闪退&#xff0c;终端下运行出现&#xff1a; VLC is not supposed…

DDD领域驱动设计系列-原理篇-战略设计

概述 DDD领域驱动设计是架构方法论&#xff0c;适用于业务逻辑较复杂系统。 DDD核心目的能输出领域如何划分&#xff0c;以及架构分层如何构建。 本文章系列会分2部分讲述DDD&#xff1a;1、DDD原理&#xff1b;2、DDD实践。DDD原理分为战略及战术设计2篇来讲述&#xff1b;…

Realme X7 Pro Root 刷机教程

Realme X7 Pro 刷机教程 Just For Fun&#xff0c;最近倒腾了下Realme X7 Pro 刷root。此博客为个人记录刷机过程&#xff0c;如有机友跟随本教程操作&#xff0c;请谨慎操作&#xff01;&#xff01;&#xff01; 以下教程真针对Realme X7 Pro&#xff0c;其他版本方法未知&…

无人机巡山护林,林业无人机智能助力绿色守护

随着全球环保意识的不断提高&#xff0c;无人机巡山护林已经成为解决森林巡检难题的一种独特而高效的方式。在我国&#xff0c;各地正积极探索无人机在森林防火、病虫害监测以及生态调查等领域的创新应用。随着无人机技术的不断演进&#xff0c;其在推动森林保护和可持续发展方…

每日一博 - 图解5种Cache策略

文章目录 概述读策略Cache AsideRead Through 写策略Write ThroughWrite AroundWrite Back 使用场景举例 概述 缓存是在系统中存储数据的临时存储器&#xff0c;用于提高访问速度。缓存策略定义了如何在缓存和主存之间管理数据 读策略 Read data from the system: &#x1f5…

大师学SwiftUI第18章Part2 - 存储图片和自定义相机

存储图片 在前面的示例中&#xff0c;我们在屏幕上展示了图片&#xff0c;但也可以将其存储到文件或数据库中。另外有时使用相机将照片存储到设备的相册薄里会很有用&#xff0c;这样可供其它应用访问。UIKit框架提供了如下两个保存图片和视频的函数。 UIImageWriteToSavedPh…

一文搞懂Lombok Plugins使用与原理

目录 一文搞懂Lombok使用与原理 1.前言2.什么是Lombok3. IntelliJ安装Lombok3.1通过IntelliJ的插件中心安装3.2在项目中使用Lombok Plugins 4.Lombok 注解大全说明4.1POJO类常用注解4.2其他注解 5.Lombok常见问题6.总结7.参考 文章所属专区 超链接 1.前言 2.什么是Lombok Lo…

办公自动化-批量更新tar包内文件

最近工作有点忙&#xff0c;学习的时间也少了&#xff0c;为了提高工作效率&#xff0c;有时候我们需要自己写一些提高办公处理效率给的工具或者脚本或者程序。 比如&#xff0c;我目前遇到的一个事项&#xff0c;需要更新很多个tar包文件&#xff0c;把tar包内的某个文件替换…

游戏提示找不到d3dx10_43.dll怎么办?5种方法教你如何修复

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“缺少d3dx10_43.dll文件”。这个错误提示通常出现在运行某些游戏或应用程序时&#xff0c;它意味着系统无法找到所需的动态链接库文件。本文将详细介绍d3dx10_43.dll文件的作用以及导致其丢…