C语言中的数组的使用——混乱的内存管理
在C语言中想要创建数组只能自己malloc或者calloc,数组复制则是memcpy。
这样创建出来的数组在调用时是不会检测数组边界的,即你声明了一个长度为5的数组,却可以访问第6个位置……也可以给第7个位置赋值……
不知道这算不算内存泄露,可否通过这种方法偷取内存中的情报呢?
例:
int main(){int *list=(int*)malloc(5*sizeof(int));for(int i=0;i<5;++i){list[i]=i;}for(int i=0;i<15;++i){cout<<list[i]<<endl;}free(list);
}
我给list分配了5个位置并赋值,但是调用时完全可以无视数组长度限制查看第6个位置甚至第n个位置。
在赋值时如果使用malloc,不删除原内存数据的话,则会输出某些“随机数”,是不是原内存中的数据呢?
memcpy同样不考虑边界,我可以把一个长度为20的数组复制给一个长度为5的数组,然后长度为5的数组长度就变成了20了……
例:
int main(){int* list=(int*)malloc(10*sizeof(int));int * list2=(int*)malloc(5*sizeof(int));for(int i=0;i<20;i++){list[i]=i;}memcpy(list2,list,20*sizeof(int));for(int i=0;i<20;++i){cout<<i<<" "<<list2[i]<<endl;}free(list);free(list2);
}
注意这里list只声明了长度了为10的内存,但是却赋了20个值。
list2声明长度为5,但是同样复制进了20个值,都没有报错可以正常运行。
这样……声明内存还有何意义……完全没有长度的限制啊!那会不会覆盖掉其它的内存数据?
感觉好混乱啊~
转载于:https://www.cnblogs.com/plwang1990/p/4274096.html
C语言中的数组的使用——混乱的内存管理相关推荐
- c语言中字符串数组的地址存放以及%s输出单个字符导致程序崩溃的问题
代码 总结下c语言中字符串数组的地址存放问题 #include <iostream> using namespace std; #include<bits/stdc++.h>i ...
- C语言中动态数组的作用,C语言实现动态数组
前言 在纯C语言编程中,数组的创建必须是固定的大小,因为C语言本身没有提供动态数组这种数据结构,这是一个让习惯了使用高级语言编程的人转做C开发面临的一个很头疼的问题,本篇文章就将介绍如何使用纯C语言编 ...
- 【示例】C语言中利用数组存放函数指针
C语言中利用数组存放函数指针,增加函数使用的灵活性.使用时只需提供数组索引,即可调用不同函数. 预备知识: 1.指向函数的指针 一个函数在编译时被分配一个入口地址,这个地址就被称为函数的指针. 例如: ...
- C++与C语言中有关数组中元素排序
C++与C语言中有关数组中元素排序 C语言中 #include<stdio.h> #define n 4 int main(){ int a[n]; int i,j,temp; for ...
- 在c语言中引用数组元素时,其数组下标的数据类型允许是什么
在c语言中引用数组元素时,其数组下标的数据类型允许是:整型常量或整型表达式.C语言规定只能逐个引用数组元素而不能一次引用整个数组,数据元素的表示形式为"数组名[下标]",下标可以是 ...
- C语言中字符数组的初始化与注意事项
在C语言中字符数组的初始化有三种常见的方法: char a[5] = {'a','b','c','d','e'};char c[] = {'a','b','c','d','e'};char b[] = ...
- Java语言中的----数组
day07 Java语言中的--数组 一.数组的概述: 什么是数组?数组是干什么用的?为啥要学数组?这些都是疑问.再你学完数组以后就知道了,数组是存储在相邻内存位置的单一数据类型的元素集合.什么是单 ...
- Java快速入门学习笔记8 | Java语言中的数组
有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...
- C语言中字符数组的初始化与赋值,字符串相关函数
C语言中字符数组的初始化与赋值,字符串相关函数! 1.字符数组初始化 在C语言中,字符串是当做字符数组来处理的:所以字符串有两种声明方式,一种是字符数组,一种是字符指针. (1)直接逐个初始化字符数组 ...
最新文章
- samtools merge_【生信工具】Samtools 安装与使用 | “十年以后,工具难免沦为朋友”...
- Java算法--串的简单处理
- 如何独立实现一个基于知识图谱的问答系统
- Git初学札记(九)————EGit检出远程分支
- vba判断文件是否存在的两种方法
- centos修改磁盘uuid_如何修改linux磁盘的uuid
- python拆分合并文件_python实现文件的分割与合并
- Numpy,Pandas,Matplotlib
- POJ1214 UVA127 Accordian Patience【vector】
- note同步不及时 one_续航800仅卖23万,比亚迪唐DM为啥却卖不过理想ONE?
- 当迷茫在大学里泛滥成灾——李开复
- 在OpenCV中使用YOLO v3进行物体检测
- php写幻灯片,JavaScript原生代码实现幻灯片
- 水经注地图发布服务中间件的适用范围
- 科技文献检索与计算机应用试卷,科技文献检索试卷
- 中兴e9000服务器,ZXCTN 9000-E设备系列_ZXCTN 9000-E系列中兴传输设备_中兴设备 - 诺深达华为光端机...
- 大数据毕设/课设 - 基于大数据的全国疫情实时监控大屏系统设计与实现
- k8s中对pod设置限制只设置了limits
- 代码维护服务器,维护服务器的利器-pubwin 2009程序代码
- 使用纸壳CMS创建多语言网站
热门文章
- java 全排列 非递归_全排列(递归与非递归实现) | 学步园
- Qt笔记-解决QObject::startTimer: Timers cannot be started from another thread
- C++笔记-基于邻接矩阵的BFS(宽度优先遍历)
- Java工作笔记-WebService使用JDK搭建WebService及调用
- Python笔记-使用代理切换ip爬取数据
- C++ opengl 纹理生成
- php登录注册脚本,PHP - 登录脚本
- gan怎么输入一维数据_时空序列预测模型GAN+LSTM
- @configuration注解_超级全面的 SpringBoot 注解介绍,每一个用途都应该清晰
- C语言实现tolower