zoukankan      html  css  js  c++  java
  • 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
    ",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,此时,原来的指针仍然有效。

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

  • 相关阅读:
    PKG_CONFIG_PATH 、LD_LIBRARY_PATH、PATH三个的作用
    klocwork报错:Error occurred during build: C/C+ defects detection stage failed. Program exited with 139
    修改默认内核启动以及删除Linux多余的内核
    【笔记】ubuntu内核升级到4.19后,docker服务无法启动
    TypeError: unhashable type: 'collections.OrderedDict'
    jquery 如何给新生成的元素绑定 hover事件?
    css中判断IE版本的语句
    (转)JS获取当前对象大小以及屏幕分辨率等
    (转)ie浏览器判断
    (转)javascript中的this
  • 原文地址:https://www.cnblogs.com/wkfvawl/p/8946643.html
Copyright © 2011-2022 走看看