zoukankan      html  css  js  c++  java
  • 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个值,都没有报错可以正常运行。

    这样……声明内存还有何意义……完全没有长度的限制啊!那会不会覆盖掉其它的内存数据?

    感觉好混乱啊~

  • 相关阅读:
    [整理]弦图学习笔记
    [整理]NOI Online 2021第一场题解
    [整理]Pólya 定理入门到入土
    [游记]2021省选抱灵记
    [整理]一些好玩的/板子的动态规划题目
    [整理]网络流随记——终(有关网络流的一些杂项)
    [整理][持续更新]多项式知识点大全(超简洁!)
    [洛谷P4338][题解][ZJOI2018]历史
    [游记]WC2021游记
    Codeforces Round #703 (Div. 2) (A~E)
  • 原文地址:https://www.cnblogs.com/plwang1990/p/4274096.html
Copyright © 2011-2022 走看看