关于动态分配内存

来源:百度知道 编辑:UC知道 时间:2024/05/30 00:05:39
因为数组长度不确定,我用new来动态分配内存,比如char *p = new char[],这样编译时没有错误的,运行时却发生错误,但也没有什么提示,就是说对不起,xxx.exe遇到错误需要关闭之类的,然后我就改了一下,给它一个长度,char *p = new char[50],这样是没有错误的,我想问的问题有3个:
1.为什么分配时没有指定长度会发生错误?不指定长度不是更符合“动态确定内存大小”的观点吗?
2.如果说一定要在分配时指定大小的话,那我指定50,编译器就会马上给它分配长度为50的内存区域吗?那动态的意义在哪?
3.或者说,指定长度只是一个分配上限?实际操作时还是动态确定的?
诚恳请教,拒绝灌水

char *p = new char[] 只是声明了一个*p的数组,没有分配存储空间
char *p = new char[50]声明并给数字分配存储空间
你声明的不是动态数字只是一个char类型的数组,动态数组是向数组添加数据时,数组可以自动增加容量大小
public Vector()
public vector(int initialcapacity)
public vector(int initialcapacity,int capacityIncrement)
以上3个方法是动态数组的声明方法
使用第一种方法,系统会自动对向量对象进行管理。若使用后两种方法,则系统将根据参数initialcapacity设定向量对象的容量(即向量对象可存储数据的大小),当真正存放的数据个数超过容量时,系统会扩充向量对象的存储容量。
参数capacityIncrement给定了每次扩充的扩充值。当capacityIncrement为0时,则每次扩充一倍。利用这个功能可以优化存储。

楼主看了一楼和小可二楼的说明,这个问题应该不再是问题了。
1.“动态确定内存大小”的观点指的是在程序中某个地方可以定义新变量并开辟一段内存空间,而不是一定要在主程序开始定义变量处定义该变量并开辟空间,这个空间是当时程序实际需要的大小。但是在任何时候任何地方开辟内存空间要有确定的数值,只有这样编译器才知道该开辟多大内存空间给程序使用。当然在程序运行到某个地方人为的大概可以知道要开辟多大空间或者可以从键盘输入定义的新变量所需的大小空间,这个输入是可变的。即不同地方输入可以不同,但每次输入是确定的。动态指的就是这个意思。
2.你这个和上面的不同。指定50,那就不能开辟超过50的空间。但需要用60个空间就可以用动态定义char *p = new char[60];动态就是说没有限制,可以输入不同的确定数值,这个数值由程序当时的实际情况决定。
3.一般来说指定长度是一个分配上限,实际操作时基本都要使用。动态定义大小不就是为了节约内存吗?你可以确定大小,你不知道大小怎么开辟。这样说在带链表的包含动态开辟空间的程序中,有时开辟的空间不使用程序还会出错。因为链表要有尾指针p->