目录
- 开头
- 1.怎样把数组初始化时的项数变成变量?
malloc
函数free
函数
- 2.
malloc
函数与free
函数的实际运用 - CC6 牛牛的排序
- 随机乱码打印
- 随机数组打印
- 结尾
开头
大家好,我叫这是我58。今天,我们来学一下如何把数组初始化时的项数变成变量的一些知识。
1.怎样把数组初始化时的项数变成变量?
其实,要解决这个问题,只需要把数组的内存动态化就可以了,而在以前,我们是这样定义数组的:int arr[10]
,或者是int* arr[10]
,但是,这样的数组只是静态的,根本不能灵活地改变自身的大小,而现在,只要malloc
函数申请动态内存,并且用free
函数释放动态内存,就可以把数组初始化时的项数变成你想要的变量了。那么,malloc
函数和free
函数具体是怎么样的呢?想知道的话就看一下下面的内容吧。
malloc
函数
malloc
函数,来自于stdlib.h
或malloc.h
1这两个头文件中,这个函数是这样构造的:void* malloc (size_t size);
2,而这个函数的作用就是申请一块大小为size
字节的内存,并且也返回了这块内存的开头的类型为void *
的指针,但是,这个函数申请之后的这块内存却是并没有初始化的,就好比你刚租的房子并没有装修过似的,因此,必须要把这个函数的返回值赋给的指针初始化为你想要的数,也就相当于装修了一下你刚租的房子,这样,才能使这个指针指向的东西没有问题,也就是说,在把你刚租的房子装修好之后,就不容易出现瑕疵了,如果size
是0
,就会使这个函数的返回值由特定的库实现(它可能是也可能不是空指针),但返回的指针不应被解引用2,也不应该用free
函数来释放这块空内存。而如果size
是一个一个一个一个一个一个非常大的数字(如类型为size_t
的-1
(4294967295
)),就会返回NULL
,因为要申请的大小超出了整个动态内存的大小,而且程序又对指向NULL
的指针解引用了一下,所以就爆出了一个这样的错误:(注:
ip
为NULL
)。并且,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;
}
结尾
在你看到这之后,可以评论来互动一下我哦。
选自tyustli的其中一篇博客——《C语言——malloc函数详解》 ↩︎
选自C语言中
malloc
函数的简介 ↩︎ ↩︎选自C语言中
free
函数的简介 ↩︎