malloc函数与free函数

发布于:2024-08-08 ⋅ 阅读:(117) ⋅ 点赞:(0)

开头

大家好,我叫这是我58。今天,我们来学一下如何把数组初始化时的项数变成变量的一些知识。

1.怎样把数组初始化时的项数变成变量?

其实,要解决这个问题,只需要把数组的内存动态化就可以了,而在以前,我们是这样定义数组的:int arr[10],或者是int* arr[10],但是,这样的数组只是静态的,根本不能灵活地改变自身的大小,而现在,只要malloc函数申请动态内存,并且用free函数释放动态内存,就可以把数组初始化时的项数变成你想要的变量了。那么,malloc函数和free函数具体是怎么样的呢?想知道的话就看一下下面的内容吧。

malloc函数

malloc函数,来自于stdlib.hmalloc.h1这两个头文件中,这个函数是这样构造的:void* malloc (size_t size);2,而这个函数的作用就是申请一块大小为size字节的内存,并且也返回了这块内存的开头的类型为void *的指针,但是,这个函数申请之后的这块内存却是并没有初始化的,就好比你刚租的房子并没有装修过似的,因此,必须要把这个函数的返回值赋给的指针初始化为你想要的数,也就相当于装修了一下你刚租的房子,这样,才能使这个指针指向的东西没有问题,也就是说,在把你刚租的房子装修好之后,就不容易出现瑕疵了,如果size0,就会使这个函数的返回值由特定的库实现(它可能是也可能不是空指针),但返回的指针不应被解引用2,也不应该用free函数来释放这块空内存。而如果size是一个一个一个一个一个一个非常的数字(如类型为size_t-1(4294967295)),就会返回NULL,因为要申请的大小超出了整个动态内存的大小,而且程序又对指向NULL的指针解引用了一下,所以就爆出了一个这样的错误:(注:ipNULL)。并且,malloc函数的返回值的类型void*可以被转换为所需类型的数据指针,以便可以取消引用。而接下来,我们就要讲一下free函数了。

free函数

free函数,来自于stdlib.h这个头文件,用来把申请之后的动态内存还给操作系统,以此来用于进一步的分配.free函数的内部构造是这样的:void free (void* ptr);3,如果free函数的参数不是一个动态内存,并且还不是一个空指针,那么就会出错,而如果free函数的参数为NULL,就不会执行任何的操作,并且,这个函数只是用来把申请之后的动态内存还给操作系统,并不会改变里面的值,因此,在使用完free函数之后,还要再主动把那块动态内存指向的指针设为NULL(也可以是你想要的地址)。在基本讲完这一篇博客所用到的函数——malloc函数和free函数之后,接下来就要讲一下malloc函数与free函数的实际运用了。

2.malloc函数与free函数的实际运用

CC6 牛牛的排序

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

int intcmp(const void* vp, const void* vpa) {
    return *(int*)vp - *(int*)vpa;
}
void sort(int* array, int n)  {
    qsort(array, n, 4, intcmp);
}
int main() {
    int i = 0;
    int ia = 0;
    scanf("%d", &i);
    int* arrp = (int*)malloc(4 * i);
    for (ia = 0; ia < i; ia++) {
        scanf("%d", &arrp[ia]);
    }
    sort(arrp, i);
    for (ia = 0; ia < i; ia++) {
        printf("%d ", arrp[ia]);
    }
    free(arrp);
    return 0;
}

随机乱码打印

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h> 
int main() {
	srand((size_t)time(NULL));
	int i = 0;
	int ia = 0;
	scanf("%d", &i);
	char* strp = malloc(i);
	for (; ia < i; ia++) {
		strp[ia] = rand() % 127;
	}
	printf("%s", strp);
	free(strp);
	return 0;
}

随机数组打印

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <time.h> 
int main() {
	srand((size_t)time(NULL));
	int i = 0;
	int ia = 0;
	scanf("%d", &i);
	int* arrp = malloc(4 * i);
	for (; ia < i; ia++) {
		arrp[ia] = rand();
	}
	for (ia = 0; ia < i; ia++) {
		printf("%d ", arrp[ia]);
	}
	free(arrp);
	return 0;
}

结尾

在你看到这之后,可以评论来互动一下我哦。


  1. 选自tyustli的其中一篇博客——《C语言——malloc函数详解》 ↩︎

  2. 选自C语言中malloc函数的简介 ↩︎ ↩︎

  3. 选自C语言中free函数的简介 ↩︎


网站公告

今日签到

点亮在社区的每一天
去签到