《带你学C带你飞学习笔记》——SE38动态内存管理2

本文详细介绍了C语言中动态内存管理的相关函数,包括malloc的使用,如何初始化内存空间,calloc的功能及其与malloc的区别,以及realloc的注意事项。同时,通过问题解答形式强调了动态内存管理的一些关键点,如不能用malloc初始化静态变量,以及如何使用malloc实现calloc的效果。
摘要由CSDN通过智能技术生成

知识点回顾

1. malloc 可以申请一块任意尺寸的空间

malloc不仅可以申请存储基本数据类型的空间,事实上它还可以申请一块任意尺寸的内存空间。对于后者,由于申请得到的空间的连续的,所以我们经常用数组来进行索引即可:

#include <stdio.h>
#include <stdlib.h>

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 ", ptr[i]);
        }

        putchar('\n');
        free(ptr);

        return 0;
}

2. 初始化内存空间

由于malloc并不会帮助你初始化申请的内存空间,所以需要你自己进行初始化。

当然你可以写一个循环来做这件事,但不建议你这么做,因为标准库里提供了更加高效的函数:memset。

3. calloc

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

calloc函数与malloc函数的一个重要区别是:

  1. calloc函数在申请完内存后,自动初始化该内存空间为零。
  2. malloc函数不进行初始化操作,里面数据是随机的。

4.realloc

一下几点是需要注意的:

  1. realloc函数修改ptr指向的内存空间大小为size字节
  2. 如果新分配的内存空间比原来的大,则旧内存块的数据不会发生改变;如果新的内存空间小于旧的内存空间,则可能会导致数据丢失,慎用!
  3. 该函数将移动内存空间的数据并返回新的指针
  4. 如果ptr参数为NULL,那么调用该函数就相当于调用malloc(size)
  5. 如果size参数为0,并且ptr参数部位NULL,那么调用该函数就相当于调用free(ptr)
  6. 除非ptr参数为NULL,否则ptr的值必须由先前调用malloc、calloc或realloc函数返回。

知识点回顾

0. 请问调用一次 malloc 函数可以申请多块内存空间吗?
答:不行,调用一次malloc函数智能申请一块连续的内存空间,只是其吃春可以自定义。

1. 以 mem 开头的函数比如 memcpy,memcmp 被编入字符串标准库(函数的声明包含在 string.h),那么请问它们与同在该标注库的 strncpy,strcnmp 函数有什么区别呢?
答:从形式上看,str开头的函数使用的是char类型的指针(char *)作为参数和返回值;而mem开头的函数使用的是void类型的指针(void *)作为参数和返回值。

从本质上看,str开头的函数主要目的是提供字符串的拷贝,比较等操作;而mem开头的函数主要目的是提供一个搞笑的函数接口来处理内存空间的数据。

2. 请用 malloc 函数实现 calloc(1024, sizeof(int)) 函数得到的结果?
答:calloc函数在申请完内存后,自动初始化该内存空间为零,而malloc函数不进行初始化操作,所以调用完malloc函数之后,需要在调用mamset函数将内存初始化为零。

int *ptr = (int *)malloc(1024*sizeof(int));
memset(ptr,0,1024*sizeof(int)); 

3. realloc(NULL, 1024) 的含义是?
答:申请1024个字节的内存空间,并返回地址,相当于malloc(1024)。

4. 请问下面代码存在什么问题?

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
        static int *pi = (int *)malloc(sizeof(int));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值