动态内存管理2|学习笔记

简介: 快速学习动态内存管理2

开发者学堂课程【你的第一门 C 语言课快速学习动态内存管理(2)】学习笔记,与课程紧密联系,让用户快速学习知识

课程地址https://developer.aliyun.com/learning/course/444/detail/5487


快速学习动态内存管理2


目录:

一、Malloc 函数概念、作用和示例

二、初始化内存空间概念及其示例

三、Calloc 函数原型

四、Calloc 函数等价写法

五、Calloc 函数示例

六、Realloc 函数原型

七、Realloc 函数示例


一、Malloc函数

1.概念

局变量和静态变量存放在静态区,局部变量存在在栈区,动态申请的变量malloc 函数申请的变量)存放在堆区。

malloc 函数向系统申请分配 size 个字节的内存空间,并返回一个指向这块空间的指针。申请的这块空间并没有被“清理”(初始化为 0)。如果 size 的值为 0,那么返回值会因标准库实现的不同而不同,可能是 NULL,也可能返回一个指针值,稍后可以传递给 free 函数。

2. 作用

动态内存分配函数,用来向系统请求分配内存空间

malloc 可以申请一块任意尺寸的内存空间申请得到的数据是连续的,通过数组索引进行相关操作

3.示例

[fishc@bogon sle38]$ vi test1.c

#include

int main(void)

{

int *ptr = NULL;

int num, i;

printf("请输入待录入整数的个数∶");

scanf(%d", &num) ;

Ptr=(int *)malloc(num* sizeof(int));

for (i = 0; i < num; i++)

{

printf("请录入第%d个整数∶ ",i+1);

scanf("%d"", &ptr[i]);

}

printf(""你录入的整数是:") ;

for (i =0; i < num;i++)

{

printf("%"d}

putchar( ' \n' ) ;

//申请完毕释放内存空间,需要我们手动释放

free(ptr);

执行代码:

[fishc@bogon sle38]$ gcc test1.c && ./a.out

请录入第1个整数:23

请录入第2个整数:43

请录入第3个整数:12

请录入第4个整数:46

请录入第5个整数:36

你录入的整数是:23 43 12 46 36

返回值:

1. 如果函数调用成功,返回一个指向申请的内存空间的指针,由于返回类型是 void 指针(void *),所以它可以被转换成任何类型的数据。

2. 如果函数调用失败,返回值是 NULL。

3. 如果 size 参数设置为 0,返回值也可能是 NULL,但这并不意味着函数调用失败。


二、初始化内存空间

1.概念

malloc 不会帮助初始化内存空间

以 mem 开头函数被编入字符串标准库,函数的声期包含在 string.h 这个头文件中;

—memset—使用一个常量字节填充内存空间

memset 函数使用常量字节 c 填充 s 指向的前 n 个字节。

 —memcpy—拷贝内存空间

memcpy 函数从 src 指向的内存空间拷贝 n 个字节到 dest 指向的内存空间。src 和 dest 指向的内存区域不能出现重叠,否则应该使用 memmove 函数。
memcpy 函数并不关心被复制的数据类型,只是逐字节地进行复制,这给函数的使用带来了很大的灵活性,可以面向任何数据类型进行复制。

—memove—拷贝内存空间

memmove 函数从 src 指向的内存空间拷贝 n 个字节到 dest 指向的内存空间。为了避免因为两个内存空间出现重叠而导致的悲剧,该函数会先将 src 指向的内存空间拷贝到一个临时的数组中,完了再从临时数组拷贝到目标内存空间。

—memcmp—比较内存空间

memcmp 函数比较 s1 和 s2 指向的两个内存空间前 n 个字节,返回一个小于,等于或大于 0 的数表示 s1 小于、等于或大于 s2。

 —memchr—在内存空间中搜索一个字符

memchr 函数扫描 s 指向的内存空间的前 n 个字节,找到第一个匹配字符 c 时停止操作。

2. 示例

[fishc@bogon sle38]$ vi test2.c

#include

#include estdlib.hs

#include estring.h>

#define N 10

int main(void)

{

int *ptr = NULL;

int i;

ptr = (int *)malloc (N*sizeof (int));

if ( ptr ==NULL)

{

Exit(1)

}

memset (ptr, 0,N* sizeof(int));

for (i = o; i < ; i++)

{

}

//连续的内存块使用索引的方式

putchar( ' in" );

//释放内存空间

free(ptr);

运行代码:

[fishc@bogon sle38]$ gcc test2.c && ./a.out

 

三、calloc函数

1.函数原型

--void *calloc(size_t  nmemb,  size_t size);

calloc 函数在内存中动态地申请 nmemb 个长度为 size 地连续内存空间(即申请地总空间尺寸为nmemb  *size)这些内存空间全部被初始化为0。

2.等价写法

// calloc()分配内存空间并初始化

int *ptr = (int *)calloc(8, sizeof(int) );

//malloc()分配内存空间并用memset()初始化int *ptr = (int *)malloc(8 * sizeof(int));memset(ptr, 0,8 * sizeof(int)) ;

3.示例

#include cstdio.h>

#include estdlib.hs

#include cstring.h>

int main(void)

{

int *ptr1 = NULL;

int *ptr2 = NULL;

//第一次申请的内存空间

ptrl = (int * )malloc( 10* sizeof (int));

//进行若干操作之后发现 ptr1 申请的内存空间竟然不够用! ! l

//第二次申请的内存空间

ptr2 = (int *)malloc(20*sizeof (int) );

//将 ptr1的数据拷贝到ptr2中

memcpy(ptr2, ptr1,10);free(ptrl);

//对ptr2申请的内存空间进行若干操作。..free(ptr2);

return 0;

 

四、realloc函数

1.函数原型

--void  *realloc(void  *ptr,size_t size);

以下几点是需要注意的:

-realloc 函数修改 ptr 指向的内存空间大小为 size 字节

-如果新分配的内存空间比原来的大,则旧内存块的数据不会发生改变;如果新的内存空间大小小于旧的内存空间,可能会导致数据丢失,慎用!

-该函数将移动内存空间地数据并返回新的指针。

-如果 ptr 参数为 NULL,那么调用该函数就相当于调用 malloc(size)

-如果 size 参数为0,并且 ptr 参数不为 NULL,那么调用该函数就相当于调用free(ptr)。

-除非 ptr 参数为 NULL,否则 ptr 的值必须由先前调

用malloc、calloc 或 realloc 函数返回。

2. 示例

[fishc@bogon sle38]$ vi test3.c

#include estdio.h>

#include estdlib.h>

int main(void)

{

int i, num;

int count =0;

//注意这里必须初始化为NULL

int *ptr = NULL;(

do

{

printf("请输入一个整数(输入-1表示结束):“);

scanf(%d", &num);

count++;

ptr = (int *)realloc(ptr, count * sizeof(int));

if (ptr a=NULL)

{

exit(1);

}

ptr[count-1] = num;

}while(num != -1);

printf(“请输入的整数分别是:");

for (i =0; ic count; i++)

运行结果:

[fishc@bogon sle38]$ gcc test3.c && ./a.out

相关文章
|
8月前
【深入理解计算机系统】int 不是整数 | float 不是实数 | 内存引用错误的例子 | 学习笔记
【深入理解计算机系统】int 不是整数 | float 不是实数 | 内存引用错误的例子 | 学习笔记
46 0
|
5天前
|
存储 编译器 C语言
【C++】学习笔记——内存管理
【C++】学习笔记——内存管理
25 15
|
17天前
|
存储 C++
C primer plus 学习笔记 第12章 存储类别、链接和内存管理
C primer plus 学习笔记 第12章 存储类别、链接和内存管理
|
11月前
|
存储 缓存 Linux
计算机操作系统学习笔记(5)——内存管理
计算机操作系统学习笔记(5)——内存管理
90 0
|
9月前
|
NoSQL Redis
Redis学习笔记-内存碎片对性能的影响
Redis学习笔记-内存碎片对性能的影响
73 0
|
12月前
|
存储 缓存 算法
十五、Linux性能优化实战学习笔记 - Linux内存是怎么工作的
内存管理也是操作系统最核心的功能之一。内存主要用来存储系统和应用程序的指令、数据、缓存等
245 1
|
12月前
|
存储 缓存 NoSQL
二十一、Linux性能优化实战学习笔记- 如何“快准狠”找到系统内存的问题?
已用内存、剩余内存、共享内存、可用内存、缓存和缓冲区的用量。
112 0
|
12月前
|
存储 缓存 Linux
十八、Linux性能优化实战学习笔记- 内存泄漏了,我该如何定位和处理?
当进程通过 malloc() 申请虚拟内存后,系统并不会立即为其分配物理内存,而是在首次访问时,才通过缺页异常陷入内核中分配内存.对应用程序来说,动态内存的分配和回收,是既核心又复杂的一个逻辑功能模块。管理内存的过程中,也很容易发生各种各样的“事故”.
92 0
|
12月前
|
存储 缓存 BI
|
存储 并行计算 测试技术
【CUDA学习笔记】第五篇:内存以及案例解释(附案例代码下载方式)(二)
【CUDA学习笔记】第五篇:内存以及案例解释(附案例代码下载方式)(二)
139 0
【CUDA学习笔记】第五篇:内存以及案例解释(附案例代码下载方式)(二)