为了代码观感美观,我将代码部分的注释删了
malloc
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
//使用动态内存分配函数的注意事项:
//1.要判断指针是否为空指针,如果没有成功开辟动态内存空间,则不能继续使用该指针
//2.分配的动态内存空间的数量要大于等于赋值的元素的数量,不能造成动态内存的越界访问
//3.动态内存空间中的地址是在堆区,不能将非动态内存空间的地址赋值给堆区,
// 但可以将变量的值赋值给动态内存空间所指向的位置
//4.不能对非动态内存空间的地址进行free释放
// 动态内存分配 malloc(wantMemorySize)
int main(){
int* p = (int*)malloc(10 * sizeof(int));
if (p == NULL){
printf("%s\n", strerror(errno));
}
else{
for (int i = 0; i < 10; i++){
*(p + i) = i;
int num = *(p + i);
printf("%d\t", num);//0 1 2 3 4 5 6 7 8 9
}
}
//当申请的动态内存空间不再使用时,应该还给系统
printf("\n%d\n", p[4]);//4
free(p);
//free之后还要置为NULL,否则成为野指针,因为地址还在,只是地址里面的值没了
p[5] = 1;
printf("%d\n%d\n", p[4],p[5]);// -572662307 1
p = NULL;
return 0;
}
calloc
// calloc(count,sizeof(Type))默认将开辟的动态内存数组空间置为0, 因为初始化了,所以效率比malloc低。
int main(){
int* p = (int*)calloc(10, sizeof(int));
if (p == NULL){
printf("%s\n", strerror(errno));
}
else{
for (int i = 0; i < 10; i++){
printf("%d\t", p[i]);
}
}
// free函数用来释放动态内存空间的
free(p);
p = NULL;
return 0;
}
realloc
//realloc(oldMemoryAddress , wantMemorySize)
//调整开辟的动态内存空间的大小
int main(){
// 先使用malloc开辟20个字节的空间
int* p = (int*)malloc(5 * sizeof(int));
if (p == NULL){
printf("%s\n", strerror(errno));
}
else{
for (int i = 0; i < 5; i++){
*(p + i) = i;
printf("%d\t", *(p + i));//0 1 2 3 4
}
printf("\n");
}
//假设20个字节不能满足我们的使用了
//现在希望有40个字节的动态内存空间可以使用
//realloc调整开辟的动态内存空间的大小
//1.realloc如果旧地址后面的空间能够满足新增的空间大小,就追加到旧地址的后面,返回旧地址
//2.否则就开辟一块新的动态内存空间,将旧动态内存空间中的值拷到新动态内存空间中相应的位置,
// 然后释放旧的动态内存空间,返回新动态内存空间的地址
int* p_realloc = (int*)realloc( p , 40);
if (p_realloc == NULL){
printf("%s", strerror(errno));
}
else{
//不管是新地址还是旧地址依然给p管理,达到为p增加动态内存空间的目的
p = p_realloc;
for (int i = 5; i < 10; i++){
*(p + i) = i;
}
for (int i = 0; i < 10; i++){
printf("%d\t", *(p + i));//0 1 2 3 4 5 6 7 8 9
}
}
//因为p和realloc存放的地址是一样的,只需要把p放了就行
free(p);
p = NULL;
p_realloc = NULL;
return 0;
}
//realloc也可以和malloc一样开辟动态内存空间
//realloc(NULL,memorySize)
int main(){
int* p = realloc(NULL, 10 * sizeof(int));
if (p == NULL){
printf("%s", strerror(errno));
}
else{
for (int i = 0; i < 10; i++){
*(p + i) = i;
printf("%d", *(p + i));//0123456789
}
}
free(p);
p = NULL;
return 0;
}