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

知识点回顾

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));
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
cda备考学习学习笔记——基础知识篇(二)主要涉及了计算机科与技术领域的基本概念和知识。 首先,它介绍了计算机网络的基础知识。网络是将多台计算机通过通信链路连接起来,使它们能够相互通信和共享资源的系统。笔记中详细介绍了网络的组成、拓扑结构和通信协议等重要内容。 其次,笔记还解释了计算机系统的基本组成。计算机系统由硬件和软件两部分组成,其中硬件包括中央处理器、存储器、输入输出设备等,而软件则分为系统软件和应用软件。笔记详细介绍了各种硬件和软件的功能和作用。 此外,笔记还对数据库管理系统进行了介绍。数据库管理系统是一种用于管理和组织数据的软件系统,它能够实现数据的存储、检索和更新等操作。笔记中详细介绍了数据库的概念、结构和操作等内容。 最后,笔记还包括了算法和数据结构的基础知识。算法是解决问题的一系列步骤和规则,而数据结构则是组织和存储数据的方式。笔记中介绍了常用的算法和数据结构,如排序算法、树和图等。 总之,通过学习CDA备考学习笔记中的基础知识篇(二),我们能够更好地理解计算机网络、计算机系统、数据库管理系统以及算法和数据结构等相关概念和知识。这些基础知识对于我们深入研究计算机科与技术领域是非常重要的,也为我们日后的学习和工作奠定了坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值