C语言:如果不使用malloc和calloc来分配内存,直接定义变量时,系统是怎么分配内存的?

作者&投稿:臧何 (若有异议请与网页底部的电邮联系)
C语言中动态内存分配函数的用法及作用?(比如malloc,calloc,realloc等)~

先举个例子:某用户需要一个将任意多个整数按大小排序的程序。(在计算机文件夹中,当文件很多时经常用到排序)
1。若不用动态分配内存,那就定义一个超大的数组吧!问题是,如果用户不需要那么大,不就浪费了?如果定义的数组还不够大,不就不能满足需求了?
2。如果用动态分配,就解决上述问题了。当你需要多大内存时,就给你多大——如果有的话——这就是动态分配的意义。

现在看上述问题的代码,我调试过的:
----------------------------------------------------------------------
#include
#include /* calloc、exit需要声明头文件 */
void main()
{
int n,*p,i,j,m;
printf("本程序可对任意个整数排序;
");
printf("请输入整数的总个数: ");
scanf("%d",&n);
p=(int *)calloc(n,sizeof(int)); /* calloc函数的使用 */
if(p==0) {
printf("分配失败!
");
exit(1); /* 当分配失败时,exit可以终止程序 */
}
printf("请输入这些整数:
");
for(i=0;i<n;i++)
scanf("%d",p+i); /* 利用指针移位的方法赋值 */
for(i=1;i<n;i++) /* 冒泡排序法 */
{
for(j=0;j<n-i;j++)
if(*(p+j)>*(p+j+1))
{
m=*(p+j);
*(p+j)=*(p+j+1);
*(p+j+1)=m;
}
}
printf("将这些整数从小到大排列输出为:");
for(i=0;i<n;i++)
{
if(i%5==0) printf("
"); /* 每隔5个数换行 */
printf(" %11d;",*(p+i));
/* 为了整齐,每个数占11个字符,当数字很多时这很重要 */
}
printf("
");
free(p); /* 释放空间 */
}

----------------------------------------------------------------------
调用calloc函数时,calloc(n,sizeof(int))表示请求n个连续的、每个长度为整型的空间,若成功返回这些空间的首地址。(int *)表示将这个地址放在指针中。到此为止,就可以用指针来对分配到的空间操作了。注意,最后一定要用free函数释放申请到的空间,否则这部分空间会一直占着。

malloc、calloc、realloc的用法(以上述问题为例)及区别:
1。malloc(n*sizeof(int)) /* 请求n个连续的、每个长度为整型的空间,若成功返回这些空间的首地址,失败返回0 */
2。calloc(n,sizeof(int)) /* 请求n个连续的、每个长度为整型的空间,若成功返回这些空间的首地址并将每个空间赋值为0,失败返回0 */
3。realloc(p,sizeof(int)*n) /* 给一个已经分配了地址的指针重新分配空间,参数p为原有的空间地址,sizeof(int)*n是重新申请的地址长度,用于分配不足的时候。个人觉得没用——不够就找到原分配处改大一点不就行了?! */

我能说得只有这些了,有些东西看起来麻烦,当你小试一下就会发现,不过如此嘛!学C要多练、多思,不怕麻烦。不知道您学了递归没有?有个经典的“汉诺塔”问题,那家伙——得整死人啊!到现在我还一知半解的……
希望我的回答对您有帮助!

函数malloc()和calloc()都可以用来动态分配内存空间,但两者稍有区别。

malloc()函数有一个参数,即要分配的内存空间的大小:

void *malloc(size_t size);

calloc()函数有两个参数,分别为元素的数目和每个元素的大小,这两个参数的乘积就是要分配的内存空间的大小。

void *calloc(size_t numElements,size_t sizeOfElement);

如果调用成功,函数malloc()和函数calloc()都将返回所分配的内存空间的首地址。

函数malloc()和函数calloc()的主要区别是前者不能初始化所分配的内存空间,而后者能。如果由malloc()函数分配的内存空间原来没有被使用过,则其中的每一位可能都是0;反之,如果这部分内存曾经被分配过,则其中可能遗留有各种各样的数据。也就是说,使用malloc()函数的程序开始时(内存空间还没有被重新分配)能正常进行,但经过一段时间(内存空间还已经被重新分配)可能会出现问题。

函数calloc()会将所分配的内存空间中的每一位都初始化为零,也就是说,如果你是为字符类型或整数类型的元素分配内存,那麽这些元素将保证会被初始化为0;如果你是为指针类型的元素分配内存,那麽这些元素通常会被初始化为空指针;如果你为实型数据分配内存,则这些元素会被初始化为浮点型的零。


需要包含头文件:
#i nclude



#i nclude



函数声明(函数原型):

void *malloc(int size);



说明:malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。
从函数声明上可以看出。malloc 和 new 至少有两个不同: new 返回指定类型的指针,并且可以自动计算所需要大小。比如:



int *p;



p = new int; //返回类型为int* 类型(整数型指针),分配大小为 sizeof(int);

或:



int* parr;



parr = new int [100]; //返回类型为 int* 类型(整数型指针),分配大小为 sizeof(int) * 100;



而 malloc 则必须由我们计算要字节数,并且在返回后强行转换为实际类型的指针。



int* p;



p = (int *) malloc (sizeof(int));



第一、malloc 函数返回的是 void * 类型,如果你写成:p = malloc (sizeof(int)); 则程序无法通过编译,报错:“不能将 void* 赋值给 int * 类型变量”。所以必须通过 (int *) 来将强制转换。

第二、函数的实参为 sizeof(int) ,用于指明一个整型数据需要的大小。如果你写成:



int* p = (int *) malloc (1);

代码也能通过编译,但事实上只分配了1个字节大小的内存空间,当你往里头存入一个整数,就会有3个字节无家可归,而直接“住进邻居家”!造成的结果是后面的内存中原有数据内容全部被清空。



malloc 也可以达到 new [] 的效果,申请出一段连续的内存,方法无非是指定你所需要内存大小。



比如想分配100个int类型的空间:



int* p = (int *) malloc ( sizeof(int) * 100 ); //分配可以放得下100个整数的内存空间。



另外有一点不能直接看出的区别是,malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。



除了分配及最后释放的方法不一样以外,通过malloc或new得到指针,在其它操作上保持一致。

全局变量和静态变量的内存编译时就决定, 局部非静态变量运行时直接在栈内存快速分配。

编译的时候,已经定好了
运行时候掉程序入内存,各个变量已经就绪

全局变量和静态变量分到静态存储区,局部变量和形参分到栈里。

动态去分配内存是为了不浪费内存!不使用动态分配函数的话,系统会随意在堆上开辟一片大小未知的空间,而且不能初始化所分配的内存空间。


C语言:如果不使用malloc和calloc来分配内存,直接定义变量时,系统是怎么...
全局变量和静态变量的内存编译时就决定, 局部非静态变量运行时直接在栈内存快速分配。

单片机Keil C51 C语言多文件如何使用全局位变量?跪拜!!
extern就可以。在一个文件里定义:bdata m;sbit x=m^1;然后在另一个文件里声明:extern bdata m;(如果不使用m可以不声明。)extern bit x;这样就可以使用了。如果变量较多,建议楼上的方法,用全局头文件。

x系统配置实用程序服务哪些不能禁用
建议:如果不使用因特网联机共享(1CS)或是内置的因特网联机防火墙(1CF),停止。 16.Logical Disk Manager Administrative Service Dmadmin(逻辑磁盘管理员系统管理服务)。配置硬盘驱动器和卷。此服务只为配置处理运行,然后终止。该服务进程名为Dmadnin.exe。 依存关系:Plug and Play、Remote Procedure Call(RPC)、Logi...

我的电脑装的是windows7,我在D盘给文件夹命名时,出现资源管理器停止工作...
选择“开始→运行”,在运行对话框中键入“chkntfs \/t:0”,即可将磁盘扫描等待时间设置为0;如果要在计算机启动时忽略扫描某个分区,比如C盘,可以输入“chkntfs \/x c:”命令;如果要恢复对C盘的扫描,可使用“chkntfs \/d c:”命令,即可还原所有chkntfs默认设置,除了自动文件检查的倒计时之外。◆4、关掉调试器Dr. Wat...

c语言中m=m>0?m:-m是什么意思?在线等!!!
如果不成立返回结果就是C,所以,这个式子的意思就是m>0吗,如果是这样的,那么结果就是m,如果不是,那么结果就是-m,然后再把所得结果赋值(符号=)给m,其作用就是取m的绝对值了,如果加一个括号来表明运算符的优先级的话,会更好理解一些,即m = ( (m>0)? m :-m )...

网吧做系统是怎么做的?
IMAPI CD-Burning COM Service:用 Image Mastering Applications Programming Interface (IMAPI) 管理 CD 录制,没有刻录机和不需要系统自带的刻入功能就关 Indexing Service:通过灵活查询语言提供文件快速访问或者没有连上局域网 Messenger:传输客户端和服务器之间的 NET SEND,比如网络之间互相传送提示信息的功能,net ...

当我打开Media Player的时候我的CPU就会100%的工作,很卡看不了电影和...
如果这个服务停止,将无法使用说明及支持中心。如果这个服务被停用,它的所有依存服务将无法启动。 补充: 如果不使用就关了吧 依存: Remote Procedure Call (RPC) 建议: 禁用 HTTP SSL微软: 此服务通过安全套接字层(SSL)实现 HTTP 服务的安全超文本传送协议(HTTPS)。如果此服务被禁用,任何依赖它的服务将无法启动。

谁来帮帮我啊!!我已经优化过了还是这样的!!刚做的系统!
如果你以前遇到过这种情况,请查找user.dmp文件并删掉,可能会省掉几十M的空间。这是出错程序的现场,对我们没用。然后打开注册表,找到HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AeDebug子键分支,双击在它下面的Auto键值名称,将其“数值数据”改为0,最后按F5刷新使设置生效,这样就彻底来取消它...

我想知道计算机上在我的电脑右键属性上的管理服务中哪些服务可以关掉...
不使用多用户者禁用。 显示名称:Help and Support 进程名称:svchost.exe -k netsvcs 微软描述:启用在此计算机上运行帮助和支持中心。如果停止服务,帮助和支持中心将不可用。如果禁用服务,任何直接依赖于此服务的服务将无法启动。 补充说明:如果不使用就关了吧,现实中证明没有多少人需要它,除非有特别需求,否则建议...

C语言编程,输入一个字母.若输入m,则显示morning,怎么编写
刚刚运行过,没问题的:include<stdio.h> void main(){ char a;printf("请输入m:");scanf("%c",&a);if(a=='m'){ printf("morning\\n");} else { printf("您输入的不是m,无法显示morning!");} }

高碑店市19751383466: c语言用不用malloc有什么区别? -
居炎力杜: 用malloc的主要作用是实现数据的动态分配,就是指这个数据在你想要用它的时候你可以使用,但是以后没用的时候你需要释放掉它的时候才malloc,举个比较夸张的例子,比如你需要分配一块内存来存放一些数据,如果这块内存的生命期很短...

高碑店市19751383466: c语言不用malloc怎么动态分配数组大小
居炎力杜: 要么用new,但是本质上和malloc差不多 也可以使用内存池 boost 库里面有相关资料可以看,是别人做好的动态小块内存申请类,他本质是申请大块内存分成小块用

高碑店市19751383466: C语言中malloc函数的使用方法 -
居炎力杜: C语言中malloc是动态内存分配函数. 函数原型:void *malloc(unsigned int num_bytes); 参数:num_bytes 是无符号整型,用于表示分配的字节数. 返回值:如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返...

高碑店市19751383466: c语言指针在什么情况下需要malloc,什么时候可以不这样,(被这个问题搞晕了) -
居炎力杜: 1. C语言的内存模型包含有栈和堆两部分. 2. 栈存放的是函数执行时的变量等,这部分变量由系统自动管理,比如 int a;等,这些变量在函数体结束时自动收回. 3. 堆存放的是由用户自己手动管理的变量,这些变量是的由malloc函数建立,由 free函数释放.不会在函数体结束时自动收回.

高碑店市19751383466: c语言中,malloc和free是什么意思? -
居炎力杜: 属于内存管理的两个函数,malloc是申请内存的,free是释放内存的. 1、百malloc一般用法: int *t=NULL; t=(int *)malloc(sizeof(int)); 也可以在sizeof前面加上一个'n*'这就成了一个动态分配数组的方法. 2、free一般用法: int *t=NULL; t=(int *)...

高碑店市19751383466: C++为什么不建议使用malloc,calloc,realloc来分配内存 -
居炎力杜: 第一个 C++里面有new 和delete可以实现类似功能. malloc系列是函数,而new是操作符 用new更高效 第二个 对于对象的内存分配 使用new可以调用构造函数 而用malloc则不会, 所以有可能出现不可预知问题, 尤其是派生类对象,如果有虚函数表,那么用malloc出来的类对象,使用就是一场灾难

高碑店市19751383466: malloc有什么用 -
居炎力杜: malloc严格的说是C语言中的规范,C++一般使用new来分配内存,而且,不管是malloc还是new,都是在内存的堆区分配,用户使用完后还得自己清理,不然就会产生内存垃圾,如果这种内存垃圾积累到一定程度就会引起内存崩溃. 给你写个例...

高碑店市19751383466: C语言中动态内存分配函数的用法及作用?(比如malloc,calloc,realloc等) -
居炎力杜: 先举个例子:某用户需要一个将任意多个整数按大小排序的程序.(在计算机文件夹中,当文件很多时经常用到排序) 1.若不用动态分配内存,那就定义一个超大的数组吧!问题是,如果用户不需要那么大,不就浪费了?如果定义的数组还不...

高碑店市19751383466: malloc()和calloc()有啥区别 -
居炎力杜: malloc()和calloc()的区别: malloc()和calloc()的功能都是在内存的动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配起始地址的指针. 而他们之间的区别就是calloc在动态分配完内存后,自动初始化该内存空间为零...

高碑店市19751383466: C++中,new/delete和malloc/free的区别 -
居炎力杜: malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符.它们都可用于申请动态内存和释放内存2.对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求.对象在创建的同时要自动执行构造函数,对象在消亡之...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网