用C语言分配开辟内存问题
发布时间:2025-05-15 20:38:55 发布人:远客网络
一、用C语言分配开辟内存问题
1、你用new或malloc申请内存后,系统会为你分配在堆区的内存,系统会标记内存已经被占用了,你在程序中不释放,那么在程序运行期间这些内存一直都被系统标记为只读的,其他的程序不能使用,那么这就叫做内存泄露。你的程序运行结束了,还保留着,直到电脑重启了,内存初始化了,才会释放,所以你可以知道内存泄露的危害了,在大型程序中,很可怕的。至于你说任务管理器的内存也是一下就降下来了,那就涉及到进程的知识了
2、还有什么不明白的,你可以继续问……
3、==============================================================
4、恩,我接着楼上的讲吧,我说windows系统的
5、定义的局部变量,在程序编译的时候,编译器会建立函数栈,然后局部变量存放于栈中,windows系统中,栈大小为2M,其他楼上都说了
6、下一个:new和malloc()分配的空间都是在堆区,堆你就可以随意申请了,系统会在系统空闲的链表中找出你要申请空间的大小,标志为已经使用了,然后就会给你用在申请空间后,注意检测一下申请空间返会值,为NULL就是系统给你分配空间失败了,用完了之后,你需要delete或free()掉你申请的,然后系统就会标记为没有使用了
7、多看些内存管理的书也许对你的提高有好处
二、C语言中new的用法
使用new运算符时必须已知数据类型,new运算符会向系统堆区申请足够的存储空间,如果申请成功,就返回该内存块的首地址,如果申请不成功,则返回零值。
new运算符返回的是一个指向所分配类型变量(对象)的指针。对所创建的变量或对象,都是通过该指针来间接操作的,而动态创建的对象本身没有标识符名。
格式1:指针变量名=new类型标识符;
格式2:指针变量名=new类型标识符(初始值);
格式3:指针变量名=new类型标识符[内存单元个数];
说明:格式1和格式2都是申请分配某一数据类型所占字节数的内存空间;但是格式2在内存分配成功后,同时将一初值存放到该内存单元中;而格式3可同时分配若干个内存单元,相当于形成一个动态数组。例如:
1)new int;//开辟一个存放整数的存储空间,返回一个指向该存储空间的地址。int*a= new int即为将一个int类型的地址赋值给整型指针a
2)int*a= new int(5)作用同上,但是同时将整数空间赋值为5
对于数组进行动态分配的格式为:
指针变量名=new类型名[下标表达式];
delete [ ]指向该数组的指针变量名;
两式中的方括号是非常重要的,两者必须配对使用,如果delete语句中少了方括号,因编译器认为该指针是指向数组第一个元素的指针,会产生回收不彻底的问题(只回收了第一个元素所占空间),加了方括号后就转化为指向数组的指针,回收整个数组。
delete []的方括号中不需要填数组元素数,系统自知。即使写了,编译器也忽略。
请注意“下标表达式”不必是常量表达式,即它的值不必在编译时确定,可以在运行时确定。
一维: int*a= new int[100];//开辟一个大小为100的整型数组空间
c语言是一种结构化语言,它有着清晰的层次,可按照模块的方式对程序进行编写,十分有利于程序的调试,且c语言的处理和表现能力都非常的强大,依靠非常全面的运算符和多样的数据类型,可以轻易完成各种数据结构的构建,通过指针类型更可对内存直接寻址以及对硬件进行直接操作。
因此既能够用于开发系统程序,也可用于开发应用软件。通过对C语言进行研究分析,总结出其主要特点如下:
C语言包含有各种控制语句仅有9种,关键字也只有32个,程序的编写要求不严格且多以小写字母为主,对许多不必要的部分进行了精简。
实际上,语句构成与硬件有关联的较少,且C语言本身不提供与硬件相关的输入输出、文件管理等功能,如需此类功能,需要通过配合编译系统所支持的各类库进行编程,故c语言拥有非常简洁的编译系统。
C语言是一种结构化的语言,提供的控制语句具有结构化特征,如for语句、if⋯else语句和switch语句等。可以用于实现函数的逻辑控制,方便面向过程的程序设计。
C语言包含的数据类型广泛,不仅包含有传统的字符型、整型、浮点型、数组类型等数据类型,还具有其他编程语言所不具备的数据类型,其中以指针类型数据使用最为灵活,可以通过编程对各种数据结构进行计算。
c语言包含34个运算符,它将赋值、括号等均视作运算符来操作,使C程序的表达式类型和运算符类型均非常丰富。
C语言允许对硬件内存地址进行直接读写,以此可以实现汇编语言的主要功能,并可直接操作硬件。c语言不但具备高级语言所具有的良好特性,又包含了许多低级语言的优势,故在系统软件编程领域有着广泛的应用。
c语言是面向过程的编程语言,用户只需要关注所被解决问题的本身,而不需要花费过多的精力去了解相关硬件,且针对不同的硬件环境。
在用C语言实现相同功能时的代码基本一致,不需或仅需进行少量改动便可完成移植,这就意味着,对于一台计算机编写的C程序可以在另一台计算机上轻松地运行,从而极大的减少了程序移植的工作强度。
(7)可生成的高质量目标代码,高执行效率的程序
与其他高级语言相比,C语言可以生成高质量和高效率的目标代码,故通常应用于对代码质量和执行效率要求较高的嵌入式系统程序的编写。
三、c语言如何定义无限长数组
1、C语言支持定义一个不显式定义长度的数组,即通过初始化数据来分配数组长度。
2、比如int a[]={1,2,3,4,5};数组a的长度没有显式给出,由于有5个初始化数据,所以分配空间长度为5个int型。
3、但是无论如何定义,数组的长度都是固定的,在定义的时候就已经分配好空间,从这个角度上C语言无法定义无限长的数组。但很多实际应用中又事先无法确定数组的长度,对于这类情况,一般有两种方法可以使用。
4、1由malloc和realloc两个函数,分配动态空间,随时按需改变数组的最大长度。
5、intsize=100;//最初为100个元素空间。
6、while(scanf("%d",a+i)==1)//循环向a中输入数据,直到输入非数值字符为止
7、size*=2;//将数组空间扩大二倍,也可以改用size+=100;之类的操作,使size每次增加固定值。
8、a=realloc(a,size);//分配新的空间
9、return-1;//这种情况下运行载体(如PC)内存不足以提供,中断程序。
10、if(a)free(a);//对申请的内存进行释放。
11、}
从以上程序可以看到,这种方式的原理就是每当数组空间不足时,利用函数realloc分配一段新的内存空间以增大数组长度。直到占满所有剩余空间。
12、从以上程序可以看到,这种方式的原理就是每当数组空间不足时,利用函数realloc分配一段新的内存空间以增大数组长度。直到占满所有剩余空间。
13、如果到占满所有空间还是无法存下数据,那么是硬件无法支持了。
14、所以这种方法可以做到软件意义上的无限大数组空间。
15、但是这种方法代码量比较大,而且需要频繁的进行内存的分配,如果实现知道数据的最大可能规模,那么可以用另一个方法。
16、2事先知道数据的最大规模,比如统计一个班的分数时,一个班最多不超过百人,那么可以直接定义一个长度为100的数组,或者保险起见,定义一个长度为1000的数组,并对其操作。这样在操作范围内,这个就是一个“无限长”的数组了。