8.8 【C语言】动态内存分配与指向它的指针变量

简介: 8.8 【C语言】动态内存分配与指向它的指针变量

8.8.1 什么是内存的动态分配

栈:全局变量和局部变量,全局变量是分配在内存中的静态存储区的,非静态的局部变量是分配在内存中的动态存储区的。

堆:数据临时存放在一个特别的自由存储区。

8.8.2 怎样建立内存的动态分配

对内存的动态分配是通过系统提供的库函数来实现的,主要有malloc,calloc,free,realloc这四个函数。


1.用malloc函数开辟动态存储区

其函数原型为:

void * malloc(unsigned int size);

作用是在内存的动态存储区中分配一个长度为size的连续空间。

2.用calloc函数开辟动态存储区

函数原型为:

void * calloc(unsigned n,unsigned size);在内存的动态存储区中分配n个长度为size的连续空间,这个空间一般比较大,足以保存一个数组。

3.用realloc函数重新分配动态分配区

其函数原型为:

void * realloc(void *p,unsigned int size);

如果已经通过malloc函数或calloc函数获得了动态空间,想改变其大小,可以用recalloc函数重新分配。

4.用free函数释放动态存储区

其函数原型为

void free(void * p);

作用是释放指针变量p所指向的动态空间,使这部分空间能重新被其他变量使用。

8.8.3 void指针类型

不要把“指向void类型”理解为能指向“任何的类型”的数据,而应理解为“指向空类型”或“不指向确定的类型”的数据。

例8.30:建立动态数组,输入5个学生的成绩,另外用一个函数检查其中有无低于60分的,输出不及格成绩。

#include<stdio.h>
#include<stdib.h>           //程序中用了malloc函数,应包含stdib.h
int main(){
    void check(int *);      //函数声明
    int *pi,i;
    p1=(int * )malloc(5 *sizeof(int));  //开辟动态存储区,将地址转换成int*型,然后放在p1中
    for(i=0;i<5;i++)
    scanf("%d",p1+1);       //输入五个学生成绩
    check(p1);             //调用check函数
    return 0;
}
void check(int *p){       //定义check函数,形参是int*指针
    int i;
    printf("they are fail:");
    for(i=0;i<5;i++)
    if(p[i]<60)printf("%d",p[i]);   //输出不合格成绩
    printf("\n");
}


相关文章
|
22天前
|
存储 C++
C++语言中指针变量int和取值操作ptr详细说明。
总结起来,在 C++ 中正确理解和运用 int 类型地址及其相关取值、设定等操纵至关重要且基础性强:定义 int 类型 pointer 需加星号;初始化 pointer 需配合 & 取址;读写 pointer 执向之处需配合 * 解引用操纵进行。
133 12
|
2月前
|
安全 C语言 C++
比较C++的内存分配与管理方式new/delete与C语言中的malloc/realloc/calloc/free。
在实用性方面,C++的内存管理方式提供了面向对象的特性,它是处理构造和析构、需要类型安全和异常处理的首选方案。而C语言的内存管理函数适用于简单的内存分配,例如分配原始内存块或复杂性较低的数据结构,没有构造和析构的要求。当从C迁移到C++,或在C++中使用C代码时,了解两种内存管理方式的差异非常重要。
120 26
|
2月前
|
安全 C语言
C语言中的字符、字符串及内存操作函数详细讲解
通过这些函数的正确使用,可以有效管理字符串和内存操作,它们是C语言编程中不可或缺的工具。
232 15
|
7月前
|
存储 人工智能 程序员
一文彻底搞清楚C语言的数据类型和变量
本文介绍了数据类型(基本、构造、指针、空类型)、变量(使用、命名规则、作用域)和常量(字面、符号、枚举、表达式),帮助初学者理解编程基础概念。坚持学习,定能创造奇迹!
700 1
一文彻底搞清楚C语言的数据类型和变量
|
7月前
|
存储 人工智能 Java
一文轻松拿捏C语言的指针的基础使用
本文介绍了C语言中的指针概念,包括直接访问和间接访问内存的方式、指针变量的定义与使用、取址运算符`&`和取值运算符`*`的应用,帮助读者深入理解指针这一C语言的核心概念。君志所向,一往无前!
135 0
|
9月前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
299 7
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
9月前
|
存储 编译器 程序员
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
在C语言中,内存布局是程序运行时非常重要的概念。内存布局直接影响程序的性能、稳定性和安全性。理解C程序的内存布局,有助于编写更高效和可靠的代码。本文将详细介绍C程序的内存布局,包括代码段、数据段、堆、栈等部分,并提供相关的示例和应用。
290 5
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
|
9月前
|
存储 编译器 C语言
【C语言】C语言的变量和声明系统性讲解
在C语言中,声明和定义是两个关键概念,分别用于告知编译器变量或函数的存在(声明)和实际创建及分配内存(定义)。声明可以多次出现,而定义只能有一次。声明通常位于头文件中,定义则在源文件中。通过合理组织头文件和源文件,可以提高代码的模块化和可维护性。示例包括全局变量、局部变量、函数、结构体、联合体、数组、字符串、枚举和指针的声明与定义。
259 12
|
9月前
|
存储 编译器 C语言
【C语言】指针大小知多少 ?一场探寻C语言深处的冒险 !
在C语言中,指针的大小(即指针变量占用的内存大小)是由计算机的体系结构(例如32位还是64位)和编译器决定的。
1063 9
|
9月前
|
安全 程序员 C语言
【C语言】指针的爱恨纠葛:常量指针vs指向常量的指针
在C语言中,“常量指针”和“指向常量的指针”是两个重要的指针概念。它们在控制指针的行为和数据的可修改性方面发挥着关键作用。理解这两个概念有助于编写更安全、有效的代码。本文将深入探讨这两个概念,包括定义、语法、实际应用、复杂示例、最佳实践以及常见问题。
257 7