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代码效果展示