首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

关于C语言中的malloc和free函数的用法

关于分配失败的原因,应该有多种,比如说空间不足就是一种。...3、关于函数使用需要注意的一些地方: A、申请了内存空间后,必须检查是否分配成功。 B、当不需要再使用申请的内存时,记得释放;释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用了它。...(这点我上面稍微提过) 所以,举个例子,如果你在函数上面定义了一个指针变量,然后在这个函数里申请了一块内存让指针指向它。实际上,这个指针的地址是在栈上,但是它所指向的内容却是在堆上面的!...因为我看了free()的源代码之后对这个变量感觉有点纳闷(源代码在下面分析)。这里还请大家指出!    所以,free()就是根据这个结构体的信息来释放malloc()申请的空间!...这个变量的值是1,表明是可以用的空间!只是这里我想了想,如果把它改为0或者是其他值不知道会发生什么事?!但是有一点我可以肯定,就是释放绝对不会那么顺利进行!因为这是一个标记!

1.4K20

C语言中 malloc函数用法

关于分配失败的原因,应该有多种,比如说空间不足就是一种。...(这点我上面稍微提过) 所以,举个例子,如果你在函数上面定义了一个指针变量,然后在这个函数里申请了一块内存让指针指向它。实际上,这个指针的地址是在栈上,但是它所指向的内容却是在堆上面的!...因为我看了free()的源代码之后对这个变量感觉有点纳闷(源代码在下面分析)。这里还请大家指出! 所以,free()就是根据这个结构体的信息来释放malloc()申请的空间!...这个变量的值是1,表明是可以用的空间!只是这里我想了想,如果把它改为0或者是其他值不知道会发生什么事?!但是有一点我可以肯定,就是释放绝对不会那么顺利进行!因为这是一个标记!...当然,这里可能还是有人会有疑问,为什么这样就可以释放呢??我刚才也有这个疑问。后来我想到,释放是操作系统的事,那么就free()这个源代码来看,什么也没有释放,对吧?

1.5K30
您找到你想要的搜索结果了吗?
是的
没有找到

C语言typedef创建变量指针别名 | 使用结构体指针节省内存

需要分配内存或者让指针指向结构体 Studentp student1; // 注意是Studentp,创建的是结构体指针 student1 = (studentp)malloc(sizeof(Student...)); // 指针,要么你主动分配内存,要么你把这个指针指向一个已有的结构体~ student1->age; // 那这里student1就是一个结构体变量的指针,要用->访问 相当于你Studentp...int id; }Student, * Studentp; 那这个时候,就必须要对指针 age 也要初始化!...struct Student 的一个指针 A = (Studentp)malloc(sizeof(Student)); // 指针 A 初始化 A->age = (int*)malloc(sizeof...printf("%d", *(A->age)); // 这里也是,如果不整体加*,就会输出地址 return 0; } 四、关于什么结构体成员也有指针类型 原因: 其实是方便内存对齐,不造成内存浪费

1K10

常见内存错误

初始化堆栈中的数据 对申请的内存或自动变量进行初始化是一个好习惯,例如: int test() { int *a = (int*) malloc(10); /*判断是否申请成功*/...因为在调用返回之后,string所指向的内存已经释放了。有人可能会问了,为什么返回int类型就可以使用呢?...因为你实际上返回的就是值10,而前面返回的是string的地址,这个值你也能获取,但是要获取这个地址值指向的内存,已经不可行了。...上面所列出的仅仅是一些比较常见的内存相关问题,总结如下: 自动变量或申请的内存需要初始化 避免缓冲区溢出 指针不等同于指向的对象 指针运算以指向大小为单位 避免对NULL或已释放的内存进行引用 申请的内存不使用时及时释放...思考 下面的代码有什么问题? int *arr = (int*)malloc(10); /*do something*/ arr++; free(arr);

79520

指针--解决的疑惑

才解除了自己的疑惑 下面是对原文的复制,,最后有自己的链表程序--原文链接http://www.jb51.net/article/37516.htm 好久没有用过C/C++的二级指针了,总觉的它就是指针的指针,没什么大不了的...分析:str是一个指针,指向NULL,形参p也是一个指针,初始也指向NULL,在GetMemory函数中,这个指针又指向了新开辟的空间。...因此,将str的地址赋给临时变量p,则*p就是指针str的值,改变*p的值就相当于改变str的值。因此这种方法能够得到题目要求的效果。...另外还有一种方法,采用一级指针,让函数返回一个指针变量指向新分配的内存,程序如下: #include "stdafx.h" #include using namespace std...关于那个面试题,,,我也挂了,看后才有所警觉 下面看我的关于链表的 struct MyStruct { int num;//编号 float corse;//成绩 struct

64470

C++中指针与引用详解

存储的值是什么类型?因此指针是表示信息在内存中存储地址的一类特殊变量,指针和其所指向变量就像是一个硬币的两面。指针一直都是学习C语言的难点,在C++中又多了一个引用的概念。...为了更有助于理解,我们绘制了下图: 因此从本质上看,指针与普通的变量并没有什么太大的区别,只是指针变量可以通过解引用的方式找到指针所对应的地址中存放的数值。...还拿上面这个例子:对程序员来说,变量10的名字就是data;而对于计算机来说,变量10就是存在 8191436 地址的数据;实现程序员与计算机沟通的方式就是指针,通过对data取址让程序员能够明白计算机的存储结构...最后关于指针声明的一点建议:在声明一个指针变量时,必须要指定一个确定的地址,否则声明的指针变量不知道指向哪里,因此容易造成系统崩溃。...比如: int* p_malloc = nullptr; // 创建一个指向int的指针 p_malloc = (int*) malloc(10); //将 malloc 的返回值强制转换为 int*

56500

常见的C编程段错误及对策

一、指针没有指向一块合法的内存 定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内存。浅显的例子就不举了,这里举几个比较隐蔽的例子。...这里定义了结构体变量stu,但是他没想到这个结构体内部char *name 这成员在定义结构体变量stu 时,只是给name 这个指针变量本身分配了4 个字节。...我在检查了他的代码之后,没有发现什么问题,于是单步调试。在观察这个结构体变量的内存时,发现有几个成员的值为乱码。就是其中某一个乱码惹得祸!...3、用malloc 函数申请0 字节内存 另外还有一个问题:用malloc 函数申请0 字节内存会返回NULL 指针吗? 可以测试一下,也可以去查找关于malloc 函数的说明文档。...关于这点,我上课时让学生记住的是:一定要一夫一妻制,不然肯定出错。 malloc 两次只free 一次会内存泄漏;malloc 一次free 两次肯定会出错。

1.4K41

【C语言】内存的动态分配与释放

什么是内存的动态分配?...要知道什么是内存的动态分配,首先要清楚内存在计算机中内存是如何划分的: 如图,内存区域大致分为以下几个区域: ​ 栈区(向下增长)(stack):由编译器自动分配释放,存放:局部变量,形参,返回值....常量区(.rodata):字符串"ABCD"等 代码区(.text):存放程序的代码 我们从前的内存使用方式是,比如创建一个变量: int a=10; 这时变量是存储在栈区的,是由编译器自动分配的...,则返回一个指向已分配的空间开头的指针;若分配失败,则返回空指针 如果想了解更多关于malloc()函数相关信息,如malloc()函数参数的设定,返回值的设定,以及malloc()函数的具体使用方法等相关知识的...,重新分配为size大小 返回值 若分配成功,则返回一个指向已分配的空间开头的指针;若分配失败,则返回空指针 如果想了解更多关于realloc()函数相关信息,如realloc()函数参数的设定,返回值的设定

9110

【C】动态内存管理 malloc calloc relloc free 函数详解

本章重点 为什么存在动态内存分配 动态内存函数的介绍 malloc free calloc realloc 常见的动态内存错误 几个经典的笔试题 1.为什么存在动态内存分配 我们已经掌握的内存开辟方式有...如果参数ptr指向的空间不是动态开辟的,那free函数的行为是未定义的。 如果参数ptr是NULL指针,则函数什么事都不做。 malloc和free都声明在stdlib.h头文件中。...str); strcpy(str, "hello world"); printf(str); } int main() { Test(); return 0; } 请问这个函数有什么错误...* str = NULL; str = GetMemory(); printf(str); } int main() { Test(); return 0; } 请问这个函数有什么错误...void) { char *str = NULL; GetMemory(&str, 100); strcpy(str, "hello"); printf(str); } 请问这个函数有什么错误

25440

记一次阿里实习生电面经历

关于算法我没敢多提,因为我也怕他深入地问下去,好久没搞算法了,这次没准备,肯定会跪。 不过他也没深入的问下去 5. 书籍 问:“你没有项目经验,那你读过什么经典书籍吗?”...(其实读过一点的经典书籍还有很多……)” 6. const指针 问:“声明一个常量指针,指向一个整型,但指向的地址不可变” 哎,这个我知道是重点,也是容易混淆的知识点,前几天我还特地整理了一下。...虽然理论上malloc的返回值可以转化为任意指针类型比如:int *。但是要注意到指针的加减操作,所偏移的单位是指向类型的大小。...这也是为什么我们通常把malloc返回值转换为char *而不是int *的原因。 8. 回调函数 问:“C++中如何实现回调函数” 回调函数,挺熟的名字,callback。。。...答:“函数指针吧,先什么一种类型的函数的函数指针,然后你可以自己去实现这种类型的函数,然后再把这个函数作为参数传递给函数中(参数是函数指针的函数)。” 9.

42510

【c语言】malloc函数详解

谈到malloc函数相信学过c语言的人都很熟悉,但是malloc底层到底做了什么又有多少人知道。...1、关于malloc相关的几个函数 关于malloc我们进入Linux man一下就会得到如下结果: 也可以这样认为(window下)原型: extern void *malloc(unsigned...关于:void*,表示未确定类型的指针,c,c++规定void*可以强转为任何其他类型的指针,关于void还有一种说法就是其他任何类型都可以直接赋值给它,无需进行强转,但是反过来不可以 malloc...: malloc分配的内存大小至少为参数所指定的字节数 malloc的返回值是一个指针,指向一段可用内存的起始位置,指向一段可用内存的起始地址,多次调用malloc所分配的地址不能有重叠部分,除非某次...简单的说: malloc函数其实就是在内存中找一片指定大小的空间,然后将这个空间的首地址给一个指针变量,这里的指针变量可以是一个单独的指针,也可以是一个数组的首地址,这要看malloc函数中参数size

1.3K20

轻松带你解决c语言堆、栈、数据段、代码段、bss段的疑惑

提出了一个关于数据初始化的问题,如下图,正如你所见这个可能比较简单,但是要理解这里面的知识点,还是要花点时间来总结一下的): 一、栈: 这里可能我没有介绍什么是栈,但是老司机的你,应该知道问度娘,...为什么要使用void *作为类型?主要原因是malloc帮我们分配内存时只是分配了内存空间,至于这段空间将来用来存储什么类型的元素malloc是不关心的,由我们程序自己来决定。    ...(2)什么是void类型。早期被翻译成空型,这个翻译非常不好,会误导人。void类型不表示没有类型,而表示万能类型。...void *类型是一个指针类型,这个指针本身占4个字节,但是指针指向的类型是不确定的,换句话说这个指针在需要的时候可以被强制转化成其他任何一种确定类型的指针,也就是说这个指针可以指向任何类型的元素。  ...其实关于堆栈的区别,确实要稍微掌握,不管是面试还是工作,你必须要明白这个知识点,反正只有好处,没有坏处,哈哈。

1.1K20

易错、经典问题:return不可返回指向栈内存的指针

关于内存的分类这里只是大致说明一下,关于内存更详细的内容可查看往期笔记: 【C语言笔记】内存笔记 例子:return返回指向栈内存指针 先看一个return返回指向栈内存指针的例子: #include...那是因为GetStr函数返回指向栈内存的指针,这里的变量p是局部变量,而局部变量是分配在栈上的。...这里可能有些人会有疑惑,同样是Hello,为什么一个在栈上,一个在静态区。 char *p = "Hello"; 此处首先定义了一个指针变量p,编译器就会为指针变量开辟了栈空间。...然后把Hello保存在这个数组里,编译器就会为数组p开闭适当的栈空间来存储Hello。...除了上面的方法之外,这里还有如下几种解决方法: 1、把p定义为全局变量,因为全局变量存储在静态存储区,程序结束才会释放。但是这样会导致函数是不可重入的。关于函数的重入与不可重入可查看往期笔记。

1.2K20

C语言之动态内存管理

然而,在实际应用中,我们需要向内存中申请动态(大小可变)的内存空间,因此本文向大家介绍有关于动态内存空间的知识。...1.开辟空间时时返回的值 1.成功:返回指向开辟好的空间的首地址的指针(类型时void*,因为malloc不知道申请空间后存放的数据类型,所以具体在使用时由使用者自己决定:将返回值的类型强制转换为所需要的指针类型即可...的行为标准未定义 ②ptr = NULL,则free什么事情也不做 3.calloc函数 开辟一块动态内存空间 与malloc不同的是, 1.与malloc不同点 1.calloc开辟的空间在返回前,...为了防止这种情况的出现,就需要一个中间变量先接收realloc的返回值,再对返回值进行判断,如果返回值不为NULL的话,再用指向原地址的指针接收返回值。...当然本文的内容是作者这个初学者对于这些概念的浅薄理解,如果内容中有任何错误或者你觉得不清楚的点,可以在评论区交流(也可以私信作者)。 如果大家喜欢这篇文章,希望可以支持支持作者。

50830

【c语言】详解动态内存管理

关于动态内存分配 回想一下我们之前学过的内存开辟方式: int val = 20;//在栈空间上开辟四个字节 char arr[10] = {0};//在栈空间上开辟10个字节的连续空间 在学习c语言时我们知道数据结构通常是固定大小的...(size_t size); 这个函数向内存申请一块连续可以的空间,并返回指向这块空间的指针。...这时就需要我们主动释放开辟的空间,于是乎引入free函数,函数原型如下: void free (void* ptr); 关于这里的ptr指针,则是指向我们动态开辟的内存的首地址,只有指向首地址才能完全释放动态开辟的内存空间...关于ptr指针还有以下两个特殊情况; 如果参数ptr指向的空间不是动态开辟的,那free函数的行为是未定义的。 如果参数 ptr 是NULL指针,则函数什么事都不做。...因为++符号会改变变量的值,所以这里的p不再指向动态内存的起始位置,这时使用free释放时并不会释放完全部的动态内存。

7510

【C语言】动态内存管理

2、柔性数组成员的定义 3、柔性数组的使用 4、柔性数组的优势 一、为什么存在动态内存分配 C语言学习到现在,我们已经掌握和了解到的内存开辟方式是通过数据类型来定义变量,然后操作系统在栈区、静态区或者字符常量区上为该变量分配空间...注意事项 如果参数 ptr 指向的空间不是动态开辟的,那么 free 函数的行为是未定义的; 如果参数 ptr 是NULL指针,则函数什么都不做; 3、calloc 函数功能 calloc 函数的功能和...,我们可能会在后面的程序中让该指针变量自增,从而让其不再指向该动态空间的起始位置,而是指向中间位置或者结尾,这时我们在对其进行free操作时,也会导致程序崩溃,因为free函数必须释放一整块动态内存,而不能释放它的一部分...、堆区、静态区这三个区域,其实这只是简略的说法,内存空间的具体划分如下:(注意:这里我们只需要了解即可,关于内存空间划分的知识我们会在操作系统模块进行深入学习) ---- 六、柔性数组 1、什么是柔性数组...== NULL) { perror("malloc"); //perror函数,找到错误信息并打印 return 1; } //让结构体中的int*变量指向另一块开辟的空间 s->arr

1.6K00

动态内存分配(malloc和free​、calloc和realloc​)

2.1、malloc C语言提供了一个动态内存开辟的函数:​ void* malloc (size_t size); 这个函数向内存的堆区申请一块连续可用的空间,并返回指向这块空间的指针。...如果参数 ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的。 如果参数 ptr 是NULL指针,则函数什么事都不做。...然后,p又指向变量a的地址。此时,失去了对之前分配的内存的引用,因为没有任何指针指向它了。这就意味着你无法再访问或释放这块内存了,这被称为内存泄漏(memory leak)。...但是,因为 p 已经不再指向动态内存块的起始位置,这个操作是未定义的(undefined behavior)。...这里问题的关键在于,数组p是一个局部变量,在出 GetMemory 函数的时候,数组 p 的内存空间就被销毁了,还给了操作系统,虽然把这个数组首元素的地址返了回去,但此时再通过地址去访问这一块空间,就成了非法访问

18910

【C++】CC++内存管理

,这里涉及到我们之前C语言讲过的一个关于常量字符串的知识,我们先来复习一下: 相信现在大家就知道了,char2这个字符数组还是在栈上的,只是拿代码段(常量区)的一个常量字符串去初始化它了,然后*char2...再看pChar3是一个局部指针变量,在栈上,但是pChar3指向常量区的一个常量字符串,所以 *pChar3是在常量区。...然后ptr1还是局部指针变量,在栈上,ptr1指向的空间是malloc出来的,在堆上。...那这样的话: 那我们现在去free的时候,指针位置是不是不对啊,这才是真正出错的原因,因为free必须给的是指向空间起始位置的指针。 那delete[]为什么就没事呢?...但是呢: 我们可能会觉得这个定位new好像没什么意义,我们直接new一个对象出来他不就自动调用构造函数了,为啥非得再去用定位new去初始化呢,没必要啊。

13610

c语言中malloc的作用,malloc函数-malloc函数,详解

; 原型:extern void *malloc(unsigned int num_bytes); 头文件:#include 功能:分配长度为num_bytes字节的内存块 说明:关于该函数的原型,在以前...函数声明: 全名:void *malloc(size_t size); 备注: void* 表示未确定类型的指针,void *可以指向任何类型的数据,更明确的说是指申请内存空间时还不知道用户是用这段空间来存储什么类型的数据...malloc函数为p分配空间有什么用;p也不受malloc限制吗; 首先你要明确是指针的概念:很明确的定义就是存放地址的变量。请注意这个定义,没有任何其他的约束。...malloc分配空间,是指系统按照的你程序在内存堆栈中分配一段内存给你,而该内存段的首地址赋值给你的p,这是基本的指针概念,为什么要强调这个?...2、另外sizeof(int *)是什么意思呢?这样用就能返回一个指向int类型的指针给**d? 3、**d这里什么含义? 谢谢!

1.9K30

c语言进阶部分详解(详细解析动态内存管理)

这时候就只能试试动态存开辟了 各种变量存储位置: 二.动态内存函数的介绍 2.1 malloc( )函数 malloc函数是C语言中的一个动态内存分配函数,用于在程序运行时动态地分配内存空间...malloc函数返回一个void类型的指针,指向分配的内存空间的起始地址。...如果ptr是NULL指针,则free函数不会进行任何操作 如果参数 ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的 如果参数 ptr 是NULL指针,则函数什么事都不做 示例: int...realloc函数会尝试将ptr指向的内存空间重新分配为size大小的内存空间,并返回一个指向重新分配后的内存空间的指针 如果ptr为NULL,那么realloc的行为就相当于malloc,它会分配一个大小为...代码段:存放函数体(类成员函数和全局函数)的二进制代码 好啦,这次的内容就先到这里的,下一次会讲解一些关于动态内存的经典的题目和柔性数组相关的知识。

7210
领券