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

我不能对函数返回的字符指针使用free()

对于函数返回的字符指针,不能直接使用free()函数进行释放。这是因为函数返回的字符指针可能是在函数内部动态分配的内存,而函数执行完毕后,函数内部的局部变量和动态分配的内存都会被释放,如果在函数外部使用free()函数释放这个指针,就会导致错误。

正确的做法是,在函数外部使用这个返回的字符指针时,先将其赋值给一个新的指针变量,然后在使用完毕后,使用对应的释放函数进行内存释放。具体步骤如下:

  1. 在函数外部声明一个指针变量,用于接收函数返回的字符指针。
  2. 调用函数,并将返回的字符指针赋值给上述声明的指针变量。
  3. 在使用完毕后,使用对应的释放函数进行内存释放。

以下是一个示例代码:

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>

char* getDynamicString() {
    char* str = (char*)malloc(sizeof(char) * 10);
    strcpy(str, "Hello");
    return str;
}

int main() {
    char* ptr = getDynamicString();
    printf("%s\n", ptr);
    free(ptr);
    return 0;
}

在上述示例中,getDynamicString()函数返回一个动态分配的字符指针,然后在main()函数中将其赋值给ptr指针变量。在使用完毕后,使用free()函数释放内存。

需要注意的是,这里的示例只是为了说明不能直接使用free()函数释放函数返回的字符指针,实际情况中可能会更加复杂,需要根据具体的代码和内存管理规则来进行操作。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

golang 中函数使用返回指针返回区别,底层原理分析

变量内存分配与回收 堆与栈区别 变量内存分配逃逸分析 检查该变量是在栈上分配还是堆上分配 函数内变量在堆上分配一些 case 函数使用值与指针返回时性能差异 其他一些使用经验 总结 变量内存分配与回收...栈生长和收缩都是自动,由编译器插入代码自动完成,因此位于栈内存中函数局部变量所使用内存随函数调用而分配,随函数返回而自动释放,所以程序员不管是使用有垃圾回收还是没有垃圾回收高级编程语言都不需要自己释放局部变量所使用内存...上文介绍了 Go 中变量内存分配方式,通过上文可以知道在函数中定义变量并使用返回时,该变量会在栈上分配内存,函数返回时会拷贝整个对象,使用指针返回时变量在分配内存时会逃逸到堆中,返回时只会拷贝指针地址...那在函数返回时是使用值还是指针,哪种效率更高呢,虽然值有拷贝操作,但是返回指针会将变量分配在堆上,堆上变量分配以及回收也会有较大开销。...,如果对象生命周期存在比较久或者对象比较大,可以使用指针返回; 3、大对象推荐使用指针返回,对象大小临界值需要在具体平台进行基准测试得出数据; 4、参考一些大开源项目中使用方式,比如 kubernetes

5.2K40

【C 语言】内存四区原理 ( 常量区示例 | 不同函数返回相同字符指针地址相同 )

全局变量区 常量区 查询该 字符串常量是否存在 , 如果存在 , 直接使用字符串常量地址 赋值给 char* 指针 , 如果不存在 , 直接在常量区 创建一个新字符串 , 然后将地址 赋值给...char* 指针 ; 下面的 2 个程序 , 分别演示 不同字符串常量 和 相同字符串常量 地址区别 ; 一、正常程序 ---- 分别从两个函数中 , 获取两个不同字符串 , 打印出这两个...字符串 内容 及 指针指向地址 ; 代码示例 : #include /* * 函数1 返回字符串 1 */ char *get_str1() { char *p1...= "abc"; return p1; } /* * 函数2 返回字符串 2 */ char *get_str2() { char *p2 = "123"; return...、获取相同字符串内容 ---- 如果在 2 个函数中 , 获取 字符串 是相同字符串 ; 此时打印出两个函数指针地址是相同 , 这是因为 获取 字符串 都是从 全局区 中 常量区 中获取

3.7K10
  • 【C 语言】字符串拷贝 ( 函数形参使用推荐方法 | 凡是涉及 修改指针指向 操作一律创建新 指针变量 执行 | 引入 辅助 局部 指针变量 )

    文章目录 一、函数形参使用推荐方法 二、完整代码示例 一、函数形参使用推荐方法 ---- 在函数中 , 形参 中 指针变量 , 建议直接使用 ; 推荐 在 函数中 , 定义 局部 指针变量 , 接收...形参中 指针变量 , 具体操作函数中 定义 局部指针变量 ; 直接使用 *to_tmp++ 样式代码 , 会改变指针指向 , 有可能会导致错误 , 一旦出错 , 根本无法排查 ; 如果 将...数组首地址 常量指针 指针指向 进行修改 , 直接就报错了 ; 函数形参 值 , 不要轻易进行改变 , 因此一般函数形参 , 都定义为 const char * 指针常量 类型 ; 引入...辅助 局部变量 , 接收 函数 形参变量 ; 凡是涉及 修改指针指向 操作一律创建新 指针变量 执行 ; 代码示例 : /* * 实现字符串拷贝 ( 实现了模块化 ) * 将 from...指针指向字符串 拷贝到 to 指针指向字符串换 */ void str_copy(char *from, char *to) { // 使用局部变量 接收 形参 char *from_tmp

    96910

    【C++】动态内存管理

    sizeof() 计算字符长度,包含末尾 '\0',strlen() 计算字符长度,包含字符串末尾 '\0'。...; 若分配失败 , 则返回指针 . free() , 释放ptr指向空间 , 让这部分空间能继续用于之后动态分配 ....当ptr为空指针时 , 执行任何操作 ....+调用构造函数,而开空间这部分功能可以使用malloc来完成,但是malloc在设计时采用报错方式是返回错误码,这和C++中报错方式——抛异常不符,因此就使用malloc函数按照C++报错方式专门封装了一个用来开空间函数...如智能指针等。2、事后查错型。如泄漏检测工具。 结语 希望这篇关于 c++动态内存管理 博客能对大家有所帮助,欢迎大佬们留言或私信与我交流. 学海漫浩浩,亦苦作舟!关注,大家一起学习,一起进步!

    10510

    【C语言】动态内存开辟使用『malloc』

    write in front   大家好,是謓泽,希望你看完之后,能对你有所帮助,不足请指正!...当不再使用该变量或对象时,也就是它生命结束时,要显式释放它所占用存贮空间,这样系统就能对该堆空间进行再次分配,做到重复使用有限资源。...该指针类型始终是void*,可以将其转换为所需类型数据指针,以便可解引用。 如果函数分配请求内存块失败,则返回一个空指针NULL。...使用 malloc() 函数需要引头文件 #include free()函数 free()函数声明,如下所示↓ void free (void* ptr); ptr →...如果传递参数是一个空指针,则不会执行任何动作。 该函数返回任何值。  实际上 free()  函数是专门用来作动态内存释放或者回收

    78020

    万字长文【C++】高质量编程指南

    ,系统出现提示:内存耗尽 malloc/free,new/delete必须成对出现 5,释放了内存却继续使用它 (1)return语句写错了,注意不要返回指向 栈内存 指针或者引用,因为该内存在函数体结束时被自动销毁...字符串比较指针与数组 1,修改内容 //字符数组a容量是 6个字符,内容 hello\0 char a[] = "hello"; //a内容可以改变 a[0] = 'X'; //指针p指向常量字符串...不能对数组名进行直接复制与比较,否则会产生编译错误; 指针 p =a 并不能把 a内容复制指针 p,而是把 a地址赋给了p。...辨识重载:靠参数而不是返回不同来区分重载函数,编译器根据参数为每个重载函数产生不同内部标识符号。 extern "C"用处 如果C++程序要调用已经被编译后C函数?...C程序中,可以用宏代码提高执行效率,宏代码本身不是函数,但使用起来像函数,预处理器用复制宏代码方式替代函数调用,省去了参数压栈,生成汇编语言CALL调用,返回参数,执行return等过程,从而提高了速度

    1.5K20

    c语言进阶部分详解(《高质量C-C++编程》经典例题讲解及柔性数组)

    (ar); return 0; } 编译器都会报错,这是因为:ar其实是一个字符串常量 ,我们怎么能对常量进行修改呢?...应该使用字符数组来存储可修改字符串 所以我们可以用数组或者动态开辟进行改正问题 改进 void ToMalloc(char** p) { *p = (char*)malloc(100); } void...此时返回指针将指向无效内存(内存已经还给操作系统了) 1.3问题三 void ToMalloc(char** p, int num) { *p = (char*)malloc(num); } void...sizeof 返回这种结构大小不包括柔性数组内存 包含柔性数组成员结构一般使用malloc ()函数进行内存动态分配,并且分配内存应该大于结构大小,以适应柔性数组预期大小(多一部分要给柔性数组...如果我们把结构体内存以及其成员要内存一次性分配好了,并返回给用户一个结构体指针,用户做 一次free 就可以把所有的内存也给释放掉 优点二: 这样有利于访问速度 连续内存有益于提高访问速度

    12610

    一篇文章完全讲解C语言指针

    函数值就是这个函数地址。 字符串字面值常量作为右值时,就是这个字符串对应字符数组名称,也就是这个字符串在内存中地址。...但是下面这段代码就不会出现这样问题: ? 因为p值编程了NULL,free函数检测到p为NULL,会直接返回,而不会发生错误。...它原型如下: void free(void*ptr); free函数参数可以是任意指针,没有谁见过free参数里面的指针需要强壮为void*吧?...如果对前面指针概念理解童鞋,肯定明白这一点。...当把数组名赋值给一个指针后,再对指针使用sizeof运算符,返回指针大小。 这就是为什么将一个数组传递给一个函数时,需要另外用一个参数传递数组元素个数原因了。

    87420

    【C语言】动态内存管理

    为0,此时malloc行为取决于编译器,是未定义 返回值为void* 所以在使用时要使用强制转换方式使malloc函数知道自己开辟空间类型 2、free void free (void* ptr...20字节内存空间,当我们使用realloc再次扩展20个字节空间时候我们会向后访问20个字节,若这个区域没有被使用,前二十个字节与这二十个字节变成一块动态内存区域,返回这个位置起始地址;若这个区域被使用了...= NULL) ptr = p; 四、常见动态内存错误 1、解引用NULL int *p = (int *)malloc(INT_MAX/4); 这时p值为NULL,不能对p解引用 2、对非动态内存开辟内存使用...str为空指针,进入GetMemory将定义一个数组p,数组中存放字符串"hello world",return p返回了第一个字符’h‘地址,return结束后GetMemory被回收,字符串"hello...str为NULL,进入GetMemory,将malloc开辟动态内存空间地址存到一级指针*p中 ,&str是取整个字符地址都用二级指针接受,一级指针就是首元素地址,故指针str指向malloc

    8810

    C语言灵魂——指针

    ,当把数组名字作为指针时候,不能对它进行自增操作,会报错。...写在同一行,系统会隐式自动添加null为结尾 char c[5] = "NSSB"; 声明字符数组个数也是可以,系统会自动分配对应字节数,例如 char c[] = "ABCD";sizeof...多维数组作为参数传给函数 (是几维数组,使用数组名作为指针返回几维度-1指针) (例如:一维数组返回指向整型指针,二维数组返回指向一维数组指针,三维数组返回指二维数组指针…) 多维数组作为函数参数时候...因为malloc只是个通用函数,在堆上分配一些内存,它并不关心你用这块内存存什么,它只是简单返回指向开辟出来内存起始地址指针。 为了使用这块内存我们需要进行指针类型转换。...参数类型 参数类型 int (*p)(int, int); p = &Add;//不使用&也可以,只使用函数名会返回函数地址 //p = Add; //p(2,3) c

    93110

    分享丨CC++内存管理详解--堆、栈

    常用解决办法是,在使用内存之前检查指针是否为NULL。如果指针p是函数参数,那么在函数入口处用assert(p!=NULL)进行检查。...函数return语句写错了,注意不要返回指向“栈内存”指针”或者“引用”,因为该内存在函数体结束时被自动销毁。   (3). 使用free或delete释放了内存后,没有将指针设置为NULL。...指针远比数组灵活,但也更危险。 下面以字符串为例比较指针与数组特性。 修改内容   下面示例中,字符数组a容量是6个字符,其内容为 hello。a内容可以改变,如a[0]= ‘X’。...指针p指向常量字符串“world”(位于静态存储区,内容为world),常量字符内容是不可以被修改。...(str); } 由于“指向指针指针”这个概念不容易理解,我们可以用函数返回值来传递动态内存。

    1K21

    C++面试知识总结

    堆:程序运行时通过malloc申请内存区存放在堆中,需要使用free来释放该内存空间,生存期在malloc和free之间。...程序会给指针变量分配内存区域,而引用不需要分配内存区域。 返回引用时,在内存中产生被返回副本。...空指针:空指针表示“未分配” 或者“尚未指向任何地方” 指针。 区别:空指针可以确保指向任何对象或函数; 而未野指针或初始化指针则可能指向任何地方。...指针常量不能修改指针所指向地址,一旦初始化,地址就固定了,不能对它进行移动操作。但是指针常量内容是可以改变。 2.16 指针函数函数指针区别 指针函数返回值是指针函数。...在类中static成员变量属于整个类所拥有,对类所有对象只有一份拷贝。 在类中static成员函数属于整个类所拥有,这个函数接收this指针,因而只能访问类static成员变量。

    1.7K41

    从 RUST 库中公开 FFI

    做一些可怕事情 .. }),但是在这里,整个函数被标记为 unsafe ,因为不正确使用会导致未定义行为,比如传递 NULL 或 悬空指针。以此告诉调用者应该正确使用它并意识到可能造成后果。...返回一个指向堆上某个内存块指针,并提供从该指针获取所需数据函数。...在示例中, Manager::iter 方法返回Batteries 迭代器,也想公开它,因此执行与 battery_manager_new 函数相同操作: Box::into_raw(Box:...这里 or 这里文章将帮助你理解其中区别,以下是 matklad 简短总结: 如果你为 FFI 使用原始指针 (作为 extern “C” 函数参数和返回类型),那么 *const 和 *mut...幸运是,在例子中,不需要接收传入字符串,但我要输出它们。非常类似于前面我们在其中使用了 Box 值例子。

    1.8K30

    C语言进阶-动态内存管理柔性数组

    ,并返回指向该空间指针 如果开辟成功,则返回一个指向开辟好空间指针,并且所开辟空间内容都为随机值 如果开辟失败,则返回一个NULL指针,因此malloc返回值一定要做检查 返回类型是 void...* ,所以malloc函数并不知道开辟空间类型,具体在使用时候使用者自己来决定(需要用强制类型转化成所需要指针类型,便于空间访问) 如果参数 size 为0,malloc行为是标准是未定义,取决于编译器...) 所以要么主动free,要么只能等进程结束(自动释放内存,建议) calloc函数 作用: 同样也是用来开辟动态内存函数 定义: void* calloc (size_t num, size_t...} 解释: char *GetMemory(void) { //字符数组在栈上开辟 char p[] = "hello world"; //函数结束,对应开辟空间会被还给电脑,此时p为悬空指针...栈区主要存放运行函数而分配局部变量、函数参数、返回数据、 返回地址等 堆区(heap):一般由程序员分配释放, 若程序员释放,程序结束时可能由OS回收 (分配方式类似于链表) 数据段(静态区)(static

    63120

    【C语言】动态内存管理(heap)

    ,之前字符函数内容讲到过,不懂得可以去博客里面看 printf("%s\n", strerror(errno)); } else { //正常使用空间 int i = 0;...,使用p指针接收函数返回值,之后我们可以通过指针p来访问堆区上这块儿动态内存空间 而且函数返回值类型是void*,所以使用者在使用时,要自己进行强制类型转换满足不同程序指针类型需求 为了给大家看一下...,这时就比较搞笑了,想重新改变一下空间,这个函数没 // 开辟成功,反而还把原来指针变成空指针了,这就得不偿失了,所以我们一定要用一个新指针 // 变量来接收realloc函数返回值...栈区主要存放运行函数所分配局部变量,函数参数,返回数据,返回地址等。 2.堆区(heap):一般由程序猿分配释放,若程序猿释放,程序结束时可能由OS回收。...,必须将其放在最后一行,要不然操作系统识别不了(之前就遇到过这种问题,代码运行起来) 2.sizeof返回这种结构体大小时,是不包括柔性数组内存所占字节大小 3.包含柔性数组结构体使用malloc

    68820

    CC++内存管理-学习笔记

    释放内存继续使用 栈内存指针函数返回后依旧调用或者使用free/delete释放动态内存后依旧使用。...其中如果数组做函数参数时,数组也是按指针处理,即数组退化为指针: Char x[] = “hello” Char *p = x; Sizeof(x) = 6;//包括字符串结束符’\0′ Sizeof...函数参数在子函数使用,但是不能对其进行修改,在子函数调用时只是将改参数值传递给了子函数定义时变量,子函数执行过程中只是修改该变量,而不是调用是传递参数。...在使用中定义需要使用malloc动态分配堆内内存,如果使用一下语句分配内存情况又不一样了,如下: Char P[] = “Hello World”;//函数返回时P自动从栈内释放,所以函数返回报错...内存耗尽问题 如果动态申请分配内存空间过大时将有可能导致内存分配不成功,即所谓内存耗尽,使用malloc/new申请动态空间时将返回NULL指针

    1K20

    C++编程常用头文件及其包含函数汇总

    n,unsign size);  函数功能: 分配n个数据项内存连续空间,每个数据项大小为size  函数返回: 分配内存单元起始地址,如果不成功,返回0  2.函数名称: free  函数原型...: void free(void* p);  函数功能: 释放p所指内存区  参数说明: p-被释放指针  3.函数名称: malloc  函数原型: void * malloc(unsigned....函数名称: ecvt  函数原型: char *ecvt(double value,int ndigit,int *dec,int *sign)  函数功能: 将浮点数转换为字符串  函数返回: 转换后字符指针...dec,int *sign)  函数功能: 将浮点数变成一个字符串  函数返回: 转换后字符指针  常用函数分类  1.字符转换函数:atof,atoi,atol,strtod,strtol...需要注意是,虽然使用find()函数可以返回指向该元素迭代器,但只能对其做读操作,任何试图修改键值操作都是非法

    1.6K00

    面试总结-C++

    用sizeof来返回类型以及静态分配对象、结构或数组所占空间,返回值跟对象、结构、数组所存储内容没有关系;strlen是字符处理函数,当数组名作为参数传入时,实际上数组就退化成指针了。。...该字符串可能是自己定义,也可能是内存中随机,该函数实际完成功能是从代表该字符第一个地址开始遍历,直到遇到结束符NULL。返回长度大小不包括NULL。...malloc和free返回是void类型指针(必须进行类型转换),new和delete返回是具体类型指针free和delete对应。...见为什么不能建立引用数组 将引用作为函数参数时,可以避免对变量或者对象复制,因此不会调用对象拷贝构造函数。当希望传入引用参数不被改变时,使用const引用。...导致代码丑陋混乱优雅 解决异常安全问题: 1.多使用RAII,使用智能指针来管理内存。

    2.1K11
    领券