C语言中动态内存的分配(malloc,realloc)

 

动态内存分配:根据需要随时开辟,随时释放的内存分配方式。
分配时机和释放时机完全由程序员决定,由于没有数据声明,这部分空间没有名字。
无法像使用变量或数组那样通过变量名或数组名引用其中的数据,只能通过指针变量来访问。
注意malloc与free一般都是成对出现的只要成功申请的空间使用完后必须要释放,否则会造成内存的泄露。

#include<stdio.h>
#include<stdlib.h>
int sum(int *,int);///函数的声明
int main()
{
    int n,s,i,*p;
    scanf("%d",&n);
    p=(int *)malloc(n*sizeof(int));///malloc的返回值是void*,与p类型不一致需要强制转换,若不则自动但是会受到警告
    if(p==NULL)///动态内存分配失败
        exit(1);///停止程序的运行
    for(i=0;i<=n-1;i++)
        scanf("%d",p+i);///指针变量的输入
    s=sum(p,n);///调用函数传指针变量
    printf("%d\n",s);
    free(p);///释放内存中由malloc()函数分配的空间
    return 0;
}
int sum(int *p,int n)
{
    int i,s=0;
    for(i=0;i<=n-1;i++)
        s=s+(*p++);
    return s;
}

 

 2018年11月10号晚更新一下这篇博客,当时写这篇博客的时候是大一上学期学C语言,对动态分配了解不够,只是介绍了malloc与free,今天看数据结构的代码又产生了对realloc()函数的一些疑问,这里进行一下说明。

摘自https://blog.csdn.net/hackerain/article/details/7954006

realloc(void *__ptr, size_t __size):

将ptr所指出的已分配内存区的大小改为size

更改已经配置的内存空间,即更改由malloc()函数分配的内存空间的大小。

如果将分配的内存减少,realloc仅仅是改变索引的信息。

如果是将分配的内存扩大,则有以下情况: 1)如果当前内存段后面有需要的内存空间,则直接扩展这段内存空间,realloc()将返回原指针。 2)如果当前内存段后面的空闲字节不够,那么就使用堆中的第一个能够满足这一要求的内存块,将目前的数据复制到新的位置,并将原来的数据块释放掉,返回新的内存块位置。 3)如果申请失败,将返回NULL,此时,原来的指针仍然有效。

注意:如果调用成功,不管当前内存段后面的空闲空间是否满足要求,都会释放掉原来的指针,重新返回一个指针,虽然返回的指针有可能和原来的指针一样,即不能再次释放掉原来的指针。

 

posted @ 2018-04-25 19:09  王陸  阅读(2835)  评论(2编辑  收藏  举报