在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个值,都没有报错可以正常运行。
这样……声明内存还有何意义……完全没有长度的限制啊!那会不会覆盖掉其它的内存数据?
感觉好混乱啊~