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

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

感觉好混乱啊~

 

你可能感兴趣的:(内存管理)