• 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个值,都没有报错可以正常运行。

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

    感觉好混乱啊~

  • 相关阅读:
    IDEA复制module
    input输入框限制输入数字(含小数)
    毕设周总结---3
    皮尔森相关系数算法
    毕设周总结---2
    毕设周总结---1
    解释器模式实例
    架构模式——解释器模式
    课后作业---质量属性
    软件架构师如何工作
  • 原文地址:https://www.cnblogs.com/plwang1990/p/4274096.html
Copyright © 2020-2023  润新知