C malloc和calloc函数总结

malloc和calloc可以动态的分配内存,即:编译的时候不会分配内存运行的时候才会分配内存。很像高级语言中的new关键字。

这样的好处自然是不用多说。现在对他们的用法及注意点进行总结:

先看malloc,代码如下:

#include <stdio.h>
#include <stdlib.h>
#define N 5

int main()
{
    int i = 0;
    int * nums;
    nums = (int *)malloc(N*sizeof(int));
    //其实nums相当与[]数组:一个int类型的数组
    //为nums赋值
    for(i=0 ; i < N ; i++)
    {
        printf("请输入第%d个数值:" , i +1);
        scanf("%d",(nums+i));
    }
    for(i = 0 ; i < N ; i++)
    {
        printf("第%d个元素的值为 : %d\n" , i + 1 , *(nums + i));
    }
    free(nums);
    nums = NULL;
    return 0;
}

运行结果如下图:

现对malloc的解释如下:

1,malloc定义一个数组,数组类型需要使用强转指针,比如(int *)的意思就是:定义了一个int类型的数组,至于数组的长度即时在N*sizeof(int)中表现。N*sizeof(int)即为 5X4=20,既是在内存中动态的分配20个字节,而每个int类型占4个字节(sizeof(int)获得的 , 可能在其他的IDE中是不一样的)。其实用20/4就可以得到数组的长度为5了。

2,用完后需要手动free掉指针,这比单纯的使用数组的效率要高,但是存在一定的风险。

再看 calloc,代码如下:

#include <stdio.h>
#include <stdlib.h>
#define N 5
int main()
{
    int i = 0;
    int * nums = NULL;
    nums = calloc(N,sizeof(int));
    //为nums赋值
    for(i=0 ; i < N ; i++)
    {
        printf("请输入第%d个数值:" , i +1);
        scanf("%d",(nums+i));
    }
    for(i = 0 ; i < N ; i++)
    {
        printf("第%d个元素的值为 : %d\n" , i + 1 , *(nums + i));
    }
    free(nums);
    nums = NULL;
    return 0;
}

运行的结果和malloc的一样,就不再给图了。

事实上,calloc和malloc产生的想过是一样的,但是它们的用法上有些区别:

1,malloc需要强制转换,而calloc不需要强制转换

2,malloc和calloc的参数是不一样的:

①,malloc只有一个参数, 为数组的大小*数组类型所占的空间字节大小,为一个参数

②,calloc有2个参数, 1 : 数组的大小 ; 2 : 数组类型所占的空间字节大小。

现在提出一个注意点:

关于 free(nums) : 释放nums一定要注意,如果使用了nums++等让指针美誉指向数组的头(第一个元素),那么即使是使用了free,指针也不能被释放掉。

时间: 2024-11-02 23:32:06

C malloc和calloc函数总结的相关文章

动态分配内存函数:malloc(),calloc(),realloc(),以及memset(),free() 详细总结

以下资料大部分来源网络,个人进行了汇总和添加. 内存可分为下面几个类别: 堆栈区(stack):由编译器自动分配与释放,存放函数的参数值,局部变量,临时变量等等,它们获取的方式都是由编译器自动执行的,变量生命长度:函数结束即释放内存. 堆区(heap):一般由程序员分配与释放,即程序员不释放,程序结束时可能由操作系统回收(C/C++没有此等回收机制,Java/C#有),注意它与数据结构中的堆是两回事,分配方式倒是类似于链表. 全局区(静态区)(static):全局变量和静态变量的存储是放在一块儿

realloc,malloc,calloc函数的区别

from:http://www.cnblogs.com/BlueTzar/articles/1136549.html realloc,malloc,calloc的区别 三个函数的申明分别是: void* realloc(void* ptr, unsigned newsize); void* malloc(unsigned size); void* calloc(size_t numElements, size_t sizeOfElement); 都在stdlib.h函数库内 它们的返回值都是请求

malloc、calloc、realloc、new以及alloca函数区别

malloc.calloc.realloc.new以及alloca函数 一.综合叙述 1) malloc 函数: void *malloc(unsigned int size) 在内存的动态分配区域中分配一个长度为size的连续空间,如果分配成功,则返回所分配内存空间的首地址,否则返回NULL,申请的内存不会进行初始化. 2)calloc 函数: void *calloc(unsigned int num, unsigned int size) 按照所给的数据个数和数据类型所占字节数,分配一个

C语言中malloc()和calloc()c函数用法

C语言中malloc()和calloc()c函数用法 函数malloc()和calloc()都可以用来动态分配内存空间,但两者稍有区别. malloc()函数有一个参数,即要分配的内存空间的大小: void *malloc(size_t size); calloc()函数有两个参数,分别为元素的数目和每个元素的大小,这两个参数的乘积就是要分配的内存空间的大小. void *calloc(size_t numElements,size_t sizeOfElement); 如果调用成功,函数mall

malloc、free、realloc、calloc函数

malloc函数 原型:extern void* malloc(unsigned int size): 功能:动态分配内存: 注意:size仅仅为申请内存字节大小,与申请内存块中存储的数据类型无关,故编程时需要通过以下方式给出:"长度 * sizeof(数据类型)": 示例 //动态分配内存,输入5个数据,并把低于60的值打印出来 #include <stdio.h> #include <stdlib.h> int main() { int *ptr = (in

malloc与free函数用法

在C里,内存管理是通过专门的函数来实现.另外,为了兼容各种编程语言,操作系统提供的接口通常是 C 语言写成的函数声明 (Windows 本身也由C和汇编语言写成). 1 分配内存 malloc 函数 需要包含头文件: #include <stdlib.h> 函数声明(函数原型) void *malloc(int size); 说明:malloc 向系统申请分配指定size个字节的内存空间.返回类型是 void* 类型.void* 表示未确定类型的指针.C,C++规定,void* 类型可以强制转

malloc realloc calloc free

自上次发现自己对这几个C函数不熟悉,就打算抽空整理一下,也就现在吧.这几个函数都是跟堆内存打交道的,还有一个好玩的函数--alloca,它是跟栈内存打交道的,我想留在以后研究出好玩点的来,再专门为其写一篇铭文. 1.malloc: 头文件:<stdlib.h> 原型:extern void *malloc(unsigned int num_bytes); 功能:分配长度为num_bytes字节的内存块.如果分配成功则返回指向被分配内存的指针,否则返回NULL. 机理:malloc函数的实质体现

进程环境详解(五)---堆分配malloc、free函数详解

堆上的空间不是连续的,栈上的空间是连续的. 使用malloc函数可以获得堆上的内存空间,注意一点虽然堆上的空间是不连续的,但是调用一次malloc函数分配的是还是连续的内存. 比如malloc(10)会在堆上找到一片有10个字节大小的连续空间分配给用户程序,然后再调用一次malloc(5)会在堆上找到一片有5个字节大小的连续空间给用户程序,这两次分配的空间并不是连续的. 使用malloc分配的内存空间需要用户调用free()函数手动来释放,不释放会造成内存泄漏.但是也不能使用free()函数多次

malloc,calloc,realloc

三个函数的申明分别是: void* realloc(void* ptr, unsigned newsize); void* malloc(unsigned size); void* calloc(size_t numElements, size_t sizeOfElement); 都在stdlib.h函数库内 它们的返回值都是请求系统分配的地址,如果请求失败就返回NULL 1.  malloc用于申请一段新的地址,参数size为需要内存空间的长度,如: char* p; p=(char*)mal