当前位置: 首页 > news >正文

关于malloc,calloc,realloc

1.引用的头文件介绍:

这三个函数需要调用<stdlib.h>这个头文件

2.malloc

2.1 函数简单介绍:

首先这个函数是用于动态开辟一个空间,例如数组在c99标准之前是无法arr[N]的,这个时候就需要使用malloc去进行处理,但是这个函数刚开始使用的是不会进行初始化的且这个函数的返回值是一个void型的指针,需要自己手动进行转化,也就是开始开辟的那个空间中的内容都是随机值,如果开辟失败,就会返回一个NULL空指针。(记得要free掉动态开辟的空间哦,还有就是free的时候只是把空间归还了回去,指针并没有变,所以还需要再把它指向NULL)

2.2简单代码运用:

#include <stdio.h>
#include <stdlib.h>
int main() {
    int* p = (int*)malloc(40);

if(p=NULL){

perror("malloc");

}
    int i = 0;
    //for (i = 0; i < 10; i++) {
    //    p[i] = i;
    //}
    for (i = 0; i < 10; i++) {
        printf("%d ", p[i]);
    }

free(p);

p=NULL;

    return 0;

}

2.3代码效果展示

从图中可以看出生成的都是随机值。

3.calloc

3.1函数介绍:

这个函数基本上于malloc函数一致,只不过这个函数会进行初始化。

3.2简单代码使用:

#include <stdio.h>
#include <stdlib.h>
int main() {
    int* p = (int*)calloc(10,sizeof(int));

if(p==NULL){

perror("calloc");

}

    int i = 0;
    //for (i = 0; i < 10; i++) {
    //    p[i] = i;
    //}
    for (i = 0; i < 10; i++) {
        printf("%d ", p[i]);
    }

free(p);

p=NULL;
    return 0;

}

3.3代码效果展示

从图中可以看出是已经进行过初始化的了。

4.realloc

4.1函数介绍:

该函数能在动态开辟原来的空间的基础上进行扩展,在这里要注意,动态开辟的空间是在堆区的,所以不能简单地作用于普通的指针,扩展的规则是,如果一开始直接往后扩,空间还有剩余的话,就会接着往后,如果不够扩展的话,就会重新开辟一块能够符合的空间,然后把之前部分的内容拷贝过去,再把首地址给他,在使用的时候需要注意先给个中间存放地址的,因为要先判断是否生成成功,不然会遗失原来的数据。

4.2简单代码使用

#include <stdio.h>
#include <stdlib.h>
int find_fir(int* p, int num) {
    int* tmp = (int*)realloc(p,num*3*sizeof(int));
    if (tmp == NULL) {
        perror("realloc");
    }
    p = tmp;
    int i = 0;
    memmove(p+num, p , sizeof(int) * num);
    memmove(p+2*num, p, sizeof(int) * num);
    int flag = 0;
    for (i = 0; i < num * 3; i++) {
        flag ^= p[i];
    }
    free(p);
    p = NULL;
    return flag;


}
int main() {
    int* p = (int*)calloc(11,sizeof(int));
    if (p == NULL) {
        perror("malloc");
    }
    int i = 0;
    //for (i = 0; i < 10; i++) {
    //    p[i] = i;
    //}
    for (i = 0; i < 10; i+=2) {
        p[i] = i;
    }
    for (i = 1; i < 10; i+=2) {
        p[i] = i-1;
    }
    p[10] = 11;
    int ret = find_fir(p,11);
    printf("%d", ret);
    
    return 0;

}

简单讲解一下这个代码是在干嘛,其实就是一个在一个动态开辟的空间中存入int型数据,里面存入的数据出现两次或者一次且只有一个出现了一次,要求找到这个只出现了一次的数据。为什么要realloc呢,因为你不知道该空间中存在了哪些数,因为这些数不是按顺序排好的,为什么要realloc三倍的空间呢,因为如果进行2次就会导致一个的那个也变成了偶数次,如果三次的话刚好就可以规避这个问题。

4.3代码效果展示


http://www.mrgr.cn/news/40397.html

相关文章:

  • MySQL中的InnoDB存储引擎
  • AMD CDNA™2 GPU 中的寄存器压力
  • C++模拟实现vector容器【万字模拟✨】
  • 基于51单片机的电压表电压监测proteus仿真
  • 第九讲-按钮控件QToolButton
  • 基于Springboot+Vue的基于协同过滤算法的个性化音乐推荐系统 (含源码数据库)
  • 【Python报错已解决】 WARNING: Ignoring invalid distribution
  • python 人工智能器学习和数据预处理中 连续变量,输入信号 x 被转换成条件向量 x̂
  • 足球青训管理:Spring Boot技术实现
  • 最小二乘法拟合
  • 【云原生安全篇】Cosign助力Harbor验证镜像实践
  • 昇思MindSpore进阶教程--下沉模式
  • 移动技术开发:音乐播放器
  • JS使用MutationObserver接口来监听DOM的更新
  • 设计模式(1)observer
  • void类型
  • 闭源与开源嵌入模型比较以及提升语义搜索效果的技术探讨
  • 樊登《在云端》【夸克云盘】更新樊登讲书 4k影视 云盘分享
  • 详解TCP协议(三次握手四次挥手)
  • 详解nsenter