学习网址
C语言动态内存函数(malloc、calloc、realloc、free)详解:https://www.jb51.net/program/295325hjh.htm
C语言动态内存函数详解:https://www.jb51.net/article/223725.htm
在C语言中,动态内存函数是块重要的知识点,以往,我们开辟空间都是固定的。
数组编译结束后就不能继续给它开辟空间了,开辟的空间满了,就不能在开辟空间了。
看完本章就能向内存申请动态空间。
一、malloc函数
需要头文件:<stdib.h>
malloc函数(开辟 动态内存 的函数):
void* malloc(size_t size);
- 功能:
- 这个函数向内存申请一个连续可用的空间,并返回指向这块空间的指针。
- 如果开辟成功,则返回一个指向开辟好空间的指针。
- 如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。【判断malloc == NULL】
- 返回值的类型是void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候由使用者自己决定。【就是让使用者自己定义开辟空间使用的是什么数据类型】
- 如果size为0,malloc的行为是标准还是未定义的,由编译器决定。
- malloc申请的空间,当程序退出时,要还给操作系统,当程序不退出,动态申请的内存,不会主动释放,需要用free函数来释放。【说白了就是:使用malloc申请空间后,当程序退出时才会把这块内存释放;不退出程序的话要手动释放(显式释放)就要用free函数】
- malloc申请的内存空间: malloc申请到空间后,直接返回这个空间的首地址,不会初始化空间的内容。
- 举个例子:
申请int类型的空间(数组形式)
#include <stdio.h>
#include <stdlib.h>
int main()
{
//变长数组的知识点(vs不能用,gcc可以用)
//int num = 0;
//scanf("%d", &num);
//int arr[num] = { 0 };
int* ptr = NULL;
ptr = (int*)malloc(40);
if (ptr == NULL)//判断ptr指针是否为空,也就是查看malloc有没有申请空间成功
{
perror("malloc");
exit;
}
else
{
int i = 0;
for (i = 0; i < 10; i++)//给开辟的空间赋值
ptr[i] = i + 1;
}
free(ptr); //释放ptr指向的空间
ptr = NULL;//让ptr指向空
return 0;
}
/*
这段代码首先包含了<stdio.h>和<stdlib.h>头文件,分别提供了输入输出和动态内存分配的功能。
在注释部分,有一段代码尝试使用输入变量来创建可变数组,但是这种写法在Visual Studio中不支持,而在GCC编译器中可以使用。
接下来,声明了一个整型指针ptr并将其初始化为NULL。然后使用malloc函数动态分配了10个整数的内存空间(单个int类型的内存大小为4,所以40/4=10个),并将返回的地址赋给了ptr。
然后进行判断ptr的值:
如果分配失败,即ptr为NULL,则打印错误信息并退出程序。
如果分配成功,就进入else分支。在这个分支中,通过循环将1到10的值赋给数组的前10个元素。注意,这里的数组大小是固定的,而不是根据用户输入来确定的。
最后,使用free函数释放了ptr指向的内存空间,并将ptr设置为NULL,以避免出现悬挂指针的问题。
整个程序的目的是演示如何动态分配内存来创建一个整数数组,并对其中的元素进行赋值操作。
*/
/*-------- SOP - 举一反三 --------*/
// 下面的程序让用户输入一个数值,用做malloc申请的空间大小
#include <stdio.h>
#include <stdlib.h>
int main()
{
int num = 0;
printf("请输入你要申请的空间大小(int类型):");scanf("%d", &num);
int* ptr = NULL;
ptr = (int*)malloc(num);
printf("ptr的长度为%d个int数\n",num/sizeof(int)); // 查看开辟的空间大小
printf("单个int类型的内存大小:%d\n",sizeof(int)); // 查看int内存大小
if (ptr == NULL){ //判断ptr指针为空,malloc有没申请空间成功
perror("malloc");
exit;
}else{
int i = 0; printf("下面输出ptr空间里面的变量数据:\n");
for (i = 0; i < num/sizeof(int); i++)//给开辟的空间赋值
{ ptr[i] = i + 1;
printf("%d ",ptr[i]);
}
}
free(ptr); // 释放ptr指向的空间
ptr = NULL;// 让ptr指向空
return 0;
}
标签:malloc,int,C语言,学习,num,空间,NULL,ptr
From: https://blog.51cto.com/youyeye/9570035