C语言-用指针实现内存动态分配

简介: 动态存储分配函数在C语言中,动态分配内存是通过动态存储分配函数 malloc() 来实现的,其功能是:在内存的动态存储区中分配一连续空间。若申请成功,则返回指向所分配内存空间的起始地址的指针;若申请内存空间不成功,则返回NULL(值为0)。

动态存储分配函数

在C语言中,动态分配内存是通过动态存储分配函数 malloc() 来实现的,其功能是:

  • 在内存的动态存储区中分配一连续空间。若申请成功,则返回指向所分配内存空间的起始地址的指针;若申请内存空间不成功,则返回NULL(值为0)。
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a[5]={10,15,8,9,6};

    int length;
    printf("请输入你想分配内存空间的个数:");
    scanf("%d",&length);
    int *p = (int *)malloc(sizeof(int)*length);  //指针变量p中存放的是动态分配内存块的起始地址
    *p=10; //相当于a[0]
    p[1]=15;  //相当于a[1]
    printf("%d  %d\n",*p,p[1]);
    return 0;
}

运行结果

img_2df513b378124008e9b2009800f5d8dc.png
image.png
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int length;
    printf("请输入你想分配内存空间的个数:");
    scanf("%d",&length);
    int *p = (int *)malloc(sizeof(int)*length);
    if(p==NULL){   // 检查内存分配是否成功
        printf("Unable to allocate memory.\n");
        exit(1);
    }
    //也可以把 p 当成一个普通数组来使用
    printf("请输入 %d 个数:",length);
    for(int i=0;i<length;i++)
        scanf("%d",&p[i]);

    //打印输出数组
    printf("你输入的数组为:\n");
    for(int i=0;i<length;i++)
        printf("%d\t",*(p+i));
    free(p); //释放分配的内存空间
    return 0;
}

运行结果

img_c437e632fe11a42f5d0657ba2c003c2d.png
image.png

注意:

  • 在调用 malloc() 时,应该利用 sizeof 计算存储块大小,不要直接写数值,因为不同平台数据类型占用空间大小可能不同
  • 每次动态分配空间都必须检查是否成功,考虑到意外情况的处理
  • 虽然这里的存储块是动态分配的,但它的大小在分配后也是确定的。不要越界使用,尤其不能越界赋值,否则可能引起非常严重的错误

动态存储释放函数

动态存储分配函数 void free(void *p) 功能:

  • 释放同动态存储分配函数申请到的整块内存空间,p为指向要释放空间的首地址。如果p的值是空指针,则free什么都不做。该函数无返回值。

注意:

  • 释放后不允许再通过该指针去访问已经释放的块,否则可能引起灾难性错误。
目录
相关文章
|
1月前
|
存储 编译器 程序员
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
在C语言中,内存布局是程序运行时非常重要的概念。内存布局直接影响程序的性能、稳定性和安全性。理解C程序的内存布局,有助于编写更高效和可靠的代码。本文将详细介绍C程序的内存布局,包括代码段、数据段、堆、栈等部分,并提供相关的示例和应用。
51 5
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
|
1月前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
93 3
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
1月前
|
存储 编译器 C语言
【C语言】指针大小知多少 ?一场探寻C语言深处的冒险 !
在C语言中,指针的大小(即指针变量占用的内存大小)是由计算机的体系结构(例如32位还是64位)和编译器决定的。
59 9
|
1月前
|
安全 程序员 C语言
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
46 7
|
1月前
|
存储 缓存 算法
【C语言】内存管理函数详细讲解
在C语言编程中,内存管理是至关重要的。动态内存分配函数允许程序在运行时请求和释放内存,这对于处理不确定大小的数据结构至关重要。以下是C语言内存管理函数的详细讲解,包括每个函数的功能、标准格式、示例代码、代码解释及其输出。
66 6
|
2月前
|
传感器 人工智能 物联网
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
57 6
|
2月前
|
大数据 C语言
C 语言动态内存分配 —— 灵活掌控内存资源
C语言动态内存分配使程序在运行时灵活管理内存资源,通过malloc、calloc、realloc和free等函数实现内存的申请与释放,提高内存使用效率,适应不同应用场景需求。
|
2月前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
2月前
|
算法 C语言
C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项
本文深入讲解了C语言中的文件操作技巧,涵盖文件的打开与关闭、读取与写入、文件指针移动及注意事项,通过实例演示了文件操作的基本流程,帮助读者掌握这一重要技能,提升程序开发能力。
145 3
|
2月前
|
存储 算法 程序员
C 语言指针详解 —— 内存操控的魔法棒
《C 语言指针详解》深入浅出地讲解了指针的概念、使用方法及其在内存操作中的重要作用,被誉为程序员手中的“内存操控魔法棒”。本书适合C语言初学者及希望深化理解指针机制的开发者阅读。