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

从函数返回"char指针“有什么问题吗?

从函数返回"char指针"有以下几个问题:

  1. 内存泄漏:如果函数内部动态分配了一个char数组,并返回了指向该数组的指针,那么在函数外部使用完该指针后,需要手动释放内存。如果忘记释放内存,就会导致内存泄漏。
  2. 悬空指针:如果函数内部定义了一个局部的char数组,并返回了指向该数组的指针,那么在函数结束后,该数组将被销毁,指针将变成悬空指针。在函数外部使用该指针将导致未定义的行为。
  3. 内存访问错误:如果函数返回的char指针指向的内存区域在函数结束后被释放或重用,那么在函数外部使用该指针将导致内存访问错误,可能会导致程序崩溃或产生不可预测的结果。
  4. 多线程安全问题:如果函数返回的char指针指向的内存区域在多个线程中被访问和修改,需要确保对该内存区域的访问是线程安全的,否则可能会导致数据竞争和不一致的结果。

解决这些问题的方法是使用动态内存分配函数(如malloc)在堆上分配内存,并在使用完毕后手动释放内存(使用free函数)。另外,可以考虑使用字符串类(如std::string)作为函数返回值,以避免手动管理内存的问题。

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

相关·内容

【C++】C++ 类中的 this 指针用法 ③ ( 全局函数 与 成员函数 相互转化 | 参构造函数设置默认参数值 | 返回匿名对象与返回引用 )

- 通过 this 指针隐藏操作数 全局函数转为成员函数 , 需要隐藏一个参数 , 就是通过 this 指针隐藏左操作数 , 对象本身 就是 左操作数 , 在成员函数中 , 通过 this 指针访问对象本身的成员...return s; } 详细代码 , 参考最后的完整代码示例 ; 二、参构造函数设置默认参数值 ---- 为 Student 类定义了参构造函数 , 则其默认的无参构造函数 , 就不会生成..., 就是返回自身对象变量 // this 是指针 , *this 是指针指向的 自身对象 return *this; } 返回 引用 , 就是返回自身对象 ; this 是指针 , *this...age; this->height = this->height + s2.height; // 注意 : 返回的是一个引用 , 就是返回自身对象变量 // this 是指针 , *this...创建 Student 实例对象 Student s(18, 180); // 打印对象情况 s.print(); // 调用参构造函数 , 参构造函数参数使用默认值 Student s2

17920

【C++】深度剖析string类的底层结构及其模拟实现

我们暂且先不实现>的重载: 大家想一下,我们在string的使用里学过,string是不是一个接口叫做c_str啊: 它返回的是一个指向当前string对象对应的字符数组的指针,类型为...我们来分析一下: 首先我们的构造函数好像是没什么问题了 那问题呢其实就出现在打印上面。 那为什么第10行这里打印就崩了呢,不是返回一个空指针?那就打印空指针啊。...这里返回的是const char*类型的指针,我们说cout是会自动识别类型,它这里会以字符串的形式去打印,也就是说它不是打印这个指针,而是去解引用打印它指向的字符串,遇到\0,停止,而这里返回的是空指针...首先这里肯定是不能给空指针了: 因为下面strlen是会对str解引用的,如果是空指针就崩了。 那给个\0?...当然这里不能用out<<c_str()去打印,这个我们之前也讲了: 打印c_str返回的const char*的指针,它是遇到’\0’就停止了。所以大家可以理解成c_str就是返回C格式字符串。

21110

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

C语言变量 问:“函数中的局部变量保存在哪里?” 答:“栈” 问:“函数中的局部静态变量保存在哪里?” 答:“静态区。。” 问:“局部静态变量和全局静态变量不同,不同点在哪里?”...联合(union) 问:“知道联合?” 答:“union” 问:“和结构体何不同?” 答:“联合的每个成员的拥有共同的起始地址(共享存储空间),而结构体为每一个成员单独分配空间。”...要注意的是malloc的返回值最好要强制类型转换为 char *: // 比如分配一百个字符的空间。...这也是为什么我们通常把malloc返回值转换为char *而不是int *的原因。 8. 回调函数 问:“C++中如何实现回调函数” 回调函数,挺熟的名字,callback。。。...现在想想他的意思大概是要我操作系统的知识方面谈一下内存管理的算法,比如扫描一下,哪里未使用的空间就分配出去之类的。 后来问我什么问题。我基本没啥问题,问了点弱智问题。

42710

C语言中常见指针问题集解答

我想声明一个指针并为它分配一些空间,但却不行。这些代码什么问题?...我一个char*型指针正巧指向一些int型变量,我想跳过它们。为什么如下的代码不行?...int *ip; f(ip); 答:你确定函数初始化的是你希望它初始化的东西?请记住在 C 中, 参数是通过值传递的。被调函数仅仅修改了传入的指针副本。...你需要传入指针的地址 (函数变成接受指针指针), 或者让函数返回指针。 5. 我能否用void**指针作为参数, 使函数按引用接收一般指针? 答:不可以。C中没有一般的指针指针类型。...C“按引用传递”? 答:真的没有。严格地讲,C总是按值传递。你可以自己模拟按引用传递, 定义接受指针函数,然后在调用时使用 & 操作符。

51640

【C进阶】——动态内存管理详解 及 经典笔试题解析

我们一起来学习一下: 函数calloc 两个参数,无返回值,那它的作用是什么呢?这两个参数分别接收什么呢?...) { int* p = (int*)malloc(4); *p = 20;//如果p的值是NULL,就会有问题 free(p); p = NULL; return 0; } 大家看这段代码问题...因为malloc可能返回指针,所以像上面这样不做判断,直接对malloc返回指针,解引用,就可能会导致问题出现。...我们一起来分析一下: 首先,test函数进去,定义了一个字符指针char* str,给它赋了一个空指针NULL,然后,调用GetMemory函数,实参传的是str,GetMemory函数用了一个字符指针...是这样? 如果这样想,那就错了。 为什么呢?

12410

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

2、如何使用malloc 函数 不要莫名其妙,其实上面这段小小的对话,就是malloc 的使用过程。malloc 是一个函数,专门用来堆上分配内存。...内存分配成功之后,malloc 函数返回这块内存的首地址。你需要一个指针来接收这个地址。但是由于函数返回值是void *类型的,所以必须强制转换成你所接收的类型。...比如: char *p = (char *)malloc(100); 在堆上分配了100 个字节内存,返回这块内存的首地址,把地址强制转换成char *类型后赋给char *类型的指针变量p。...3、用malloc 函数申请0 字节内存 另外还有一个问题:用malloc 函数申请0 字节内存会返回NULL 指针? 可以测试一下,也可以去查找关于malloc 函数的说明文档。...六、内存已经被释放了,但是继续通过指针来使用 这里一般三种情况: 第一种:就是上面所说的,free(p)之后,继续通过p 指针来访问内存。解决的办法就是给p 置NULL。 第二种:函数返回栈内存。

1.4K41

我的大厂面试经历(附100+面试题干货)

__cdecl:    右往左压栈,由调用者来对堆栈数据进行清除,步骤:调用方调用函数-》函数执行-》函数结果返回-》调用方清除堆栈参数,主要针对可变参数  12:linux内部提供了那些调试宏?  ...49:如果在构造函数中调用memset(this, 0, sizeof(*this))来初始化内存空间,什么问题?  ...58:Struct{char a[0];}的作用?什么好处?   充当可变缓冲区的作用,同时char a[0]不占用内存空间。  59:如何判断两个浮点数相等?  ...一个函数,参数为int和指向返回值为void的无参数的函数指针返回值为一个指向返回值为int,参数为int和int的函数指针  87:STL空间配置器如何处理内存的?能说一下它的大概实现方案?...next是一个指针,指向一个函数,这个函数返回一个指针,这个指针指向char类型的常量指针  105:访问一个网页的过程,计算机发生了什么?

1.3K20

知识总结:C++工程师106道面试题总结(含答案详解)

__cdecl:    右往左压栈,由调用者来对堆栈数据进行清除,步骤:调用方调用函数-》函数执行-》函数结果返回-》调用方清除堆栈参数,主要针对可变参数  linux内部提供了那些调试宏?  ...如果在构造函数中调用memset(this, 0, sizeof(*this))来初始化内存空间,什么问题?  ...Struct{char a[0];}的作用?什么好处?   充当可变缓冲区的作用,同时char a[0]不占用内存空间。  如何判断两个浮点数相等?  ...一个函数,参数为int和指向返回值为void的无参数的函数指针返回值为一个指向返回值为int,参数为int和int的函数指针  STL空间配置器如何处理内存的?能说一下它的大概实现方案?...next是一个指针,指向一个函数,这个函数返回一个指针,这个指针指向char类型的常量指针  访问一个网页的过程,计算机发生了什么?

2.2K90

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

那另外: 我们malloc的时候由于可能会开辟失败的缘故,所以我们一般malloc之后会进行一个检查,如果返回的是空指针,就代表开辟失败。 那我们的new有没有可能失败呢?...当然也是可能的,但是new失败不是返回指针,而是抛异常,那关于异常我们后面也会讲到。...this << endl; } ~A() { cout << "~A():" << this << endl; } private: int _a; }; 那大家看: 这两种写法什么区别...,我们知道C++是一门基于面向对象的编程语言,面向对象的编程语言在发生错误时一般都是抛异常的,而C语言这些malloc函数发生错误时是不是都不会抛异常啊,像malloc如果申请失败是返回指针,是不是不满足需求啊...它呢会返回的位置向前减4个字节然后取到存起来的对象个数,那它就知道要调用几次析构函数了,然后释放的时候呢,它会当前位置向前偏4个字节去释放。 所以说,这种情况一定要匹配使用。

14210

C++基本概念_c语言 c++区别

指向长变量的指针定义, 85. 函数指针指针函数的区别? 函数指针是指指向一个函数入口的指针指针函数是指函数返回值是一个指针类型。 87....str5和str6并非数组而是字符指针,并不分配存储区,其后的“abc”以常量形式存于静态数据区,而它们自己仅是指向该区首地址的指针,相等。 166 以下代码中的两个sizeof用法问题?...201下面的代码什么问题?并请给出正确的写法。 void DoSomeThing(char* p) { char str[16]; int n; assert(NULL !...Void test1() { char string[10]; char *str1=”0123456789″; strcpy(string, str1); } 数组越界 203.下面代码什么问题..., str1); } } 数组越界 204下面代码什么问题?

2.5K30

你踩过几种C++内存泄露的坑?

你是否踩过? 1. 函数内或者类成员内存未释放 这类问题可以称之为out of scope的时候,并没有释放相应对象的堆上内存。有时候最简单的场景,反而是最容易犯错的。...调用XXX_Class的构造函数 那么当你调用delete pObj;的时候,道理同new,刚好相反: 调用了XXX_Class的析构函数 通过operator delete 释放了内存 一切似乎都没有什么问题...那么这个例子会导致内存泄露?...如果函数退出,那么m_pFirstNode和m_pNextNode作为栈上局部变量,智能指针本身调用自己的析构函数,给引用的对象引用计数减去1(shared_ptr本质采用引用计数,当引用计数为0的时候...你可以在函数返回前手动调用pFirstNode->m_pNextNode.reset();强制让引用计数减去1, 打破这个循环引用。

46850

C语言经典面试题_c语言常见面试题

指针的数组,该指针是指向一个整型数 的; f) 一个指向10个整型数数组的指针; g) 一个指向函数指针,该函数一个整型参数并返 回一个整型数; h) 一个10个指针的数组,该指针指向一个函数...7、请问以下代码什么问题char* s=”AAA”; printf(“%s”,s); s[0]=’B’; printf(“%s”,s); 什么错?...23、关于内存的思考题(2)你能看出有什么问题? 25、关于内存的思考题(3)你能看出有什么问题? 26、关于内存的思考题(4)你能看出有什么问题? 27、关键字volatile什么含意?...31、const 什么用途?(请至少说明两种) 【标准答案】: (1)可以定义const 常量 (2)const 可以修饰函数的参数、返回值,甚至函数 的定义体。...(1)不调用C++/C 的字符串库函数,请编写函数 strcpy 。 (2)strcpy 能把 strSrc 的内容复制到strDest,为什 么还要char * 类型的返回值?

1.7K40

你踩过几种C++内存泄露的坑?

你是否踩过? 1. 函数内或者类成员内存未释放 这类问题可以称之为out of scope的时候,并没有释放相应对象的堆上内存。有时候最简单的场景,反而是最容易犯错的。...调用XXX_Class的构造函数 那么当你调用delete pObj;的时候,道理同new,刚好相反: 调用了XXX_Class的析构函数 通过operator delete 释放了内存 一切似乎都没有什么问题...那么这个例子会导致内存泄露?...如果函数退出,那么m_pFirstNode和m_pNextNode作为栈上局部变量,智能指针本身调用自己的析构函数,给引用的对象引用计数减去1(shared_ptr本质采用引用计数,当引用计数为0的时候...你可以在函数返回前手动调用pFirstNode->m_pNextNode.reset();强制让引用计数减去1, 打破这个循环引用。

1.4K20

你可能没有实现一个正确的atoi函数

前言 我们都知道,atoi函数用于将一个字符串转换成整数。atoi函数看起来似乎很容易实现,你甚至可以很快写出一个版本,但是是否符合要求呢?...= *str) { ret = ret * 10 + *str - '0'; str++; } return ret; } 看起来既简洁又没有什么问题...实现atoi函数需要注意什么 你可能已经注意到了,实现atoi需要考虑下面这些场景: 输入正负号 开头有空格 转换后的数值超出int的表示范围 出错时返回0与正确转换0的区别 输入非数字 空字符串 现在来看...,前面的实现还能满足要求?...但这些都不是重点,重点是我们在考虑实现atoi函数的时候,需要考虑多种异常场景,这在平常实现其他功能接口的时候也是一样的。 思考 前面的代码什么不足?你忽略了哪些场景?

2.3K20

C语言高级指针理解及应用(下)

但是如果修改一下代码,会有什么问题?p3+1 和p4+1 的值又是多少呢?...C):这很容易,fun3 是函数名,p1,p2 是参数,其类型为char 型,函数返回值为char类型。...B):也很简单,与C)表达式相比,唯一不同的就是函数返回值类型为char**,是个二级指针。 A):fun1 是函数?回忆一下前面讲解数组指针时的情形。...这个函数两个指针类型的参数,函数返回值也是一个指 针。 接下来看函数指针数组、函数指针的数组的指针函数的地址存到一个数组中,那这个数组就叫函数指针数组,那函数指针的数组 如何定义呢?...main() { //函数指针pfun void (*pfun)(const char*) = test; //函数指针的数组pfunArr void (*pfunArr[5])(const char

64230

C语言面试(三)

C语言面试题目 1、描述一下两个语句的区别: char *p="hello"; char p[]="hello"; 答案: (1)、char *p 代表指针 p 是一个指向字符常量的指针...(2)、char p[] 中的 p 是一个被分配在一个可读可写内存中的字符数组的首地址,就可以改变数组上的内容。 2、当一个函数返回一个局部变量的指针时(如下面的例子),会发生什么问题?...,当函数返回时,这些被占用的栈空间将被编译器添加的代码进行退栈操作,这时原来存放在栈中的数据就统统变成了无效数据了。...因此,返回出去的指针将指向一块无效的栈空间,任何通过这个指针对其所指向的内容的访问都是无效(数据可能已经被后续的栈操作所改变)和危险的(通过这个指针所写入的数据有可能冲掉后续栈操作压人的有效数据)。...a+++++b; 思考: (1)这条语句是啥意思,或者说啥问题不? 好了,今天的分享就到这里了,希望对你帮助!

22420

C 语言内存泄露很严重,如何应对?

堆内存的获取方法 看到本小节标题,可能有些同学疑惑,上一小节中的 malloc 函数,不就是堆内存的获取方法?...一般的来讲,堆内存有如下两种获取方法: 方法一:将函数返回值直接赋给指针,一般表现形式如下: char *local_pointer_xx = NULL; local_pointer_xx = (char...data) 方法二:将指针地址作为函数返回参数,通过返回参数保存堆内存地址,一般表现形式如下: int ret; char *local_pointer_xx = NULL; /**转换后的字符串...内存泄漏三要素 最常见的内存泄漏问题,包含以下三个要素: 要素一:函数内有局部指针变量定义; 要素二:对该局部指针通过上一小节中 “两种堆内存获取方法” 之一获取内存; 要素三:在函数返回前(含正常分支和异常分支...又或者会被作为函数返回?如果都不是,就需要排查函数所有”return“的地方,保证内存被正确释放。

47320

C++经典面试题(最全,面中率最高)

3.C++哪些性质(面向对象特点) 封装,继承和多态。 4.子类析构时要调用父类的析构函数?...8.将“引用”作为函数参数哪些特点? (1)传递引用给函数与传递指针的效果是一样的。...【标准答案】 1.void * ( * (*fp1)(int))[10]; fp1是一个指针,指向一个函数,这个函数的参数为int型,函数返回值是一个指针,这个指针指向一个数组,这个数组10个元素,...3.int (* ( * fp3)())[10](); fp3是一个指针,指向一个函数,这个函数的参数为空,函数返回值是一个指针,这个指针指向一个数组,这个数组10个元素,每个元素是一个指针,指向一个函数...29题:基类的析构函数不是虚函数,会带来什么问题? 【参考答案】派生类的析构函数用不上,会造成资源的泄漏。 30题:全局变量和局部变量什么区别?是怎么实现的?操作系统和编译器是怎么知道的?

1.1K30

c++面试选择题_C语言经典笔试题

3.C++哪些性质(面向对象特点) 封装,继承和多态。 4.子类析构时要调用父类的析构函数?...8.将“引用”作为函数参数哪些特点? (1)传递引用给函数与传递指针的效果是一样的。...1.void * ( * (*fp1)(int))[10]; fp1是一个指针,指向一个函数,这个函数的参数为int型,函数返回值是一个指针,这个指针指向一个数组,这个数组10个元素,每个元素是一个...3.int (* ( * fp3)())[10](); fp3是一个指针,指向一个函数,这个函数的参数为空,函数返回值是一个指针,这个指针指向一个数组,这个数组10个元素,每个元素是一个指针,指向一个函数...第29题:基类的析构函数不是虚函数,会带来什么问题? 派生类的析构函数用不上,会造成资源的泄漏。 第30题:全局变量和局部变量什么区别?是怎么实现的?操作系统和编译器是怎么知道的?

1.1K10
领券