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

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

    感觉好混乱啊~

  • 相关阅读:
    细数ASP.NET MVC框架的7大顶级功能
    Ubuntu 10.10更新源列表
    使用iTunes将任意mp3文件转为iPhone铃声
    简单5步,在新浪微博上关联多个博客
    在windows 7 建立一个弹出光驱的快捷方式
    中国人民太伟大了!
    Ubuntu 10.10
    du 熊填数字
    WPF学习02——XAML编译
    Debugging WPF data bindings
  • 原文地址:https://www.cnblogs.com/plwang1990/p/4274096.html
Copyright © 2011-2022 走看看