C语言如何在函数中正确返回字符串指针或字符串数组

博客围绕函数返回字符串指针展开,先给出一个看似能返回字符串指针的函数示例,但因局部变量在函数调用结束后被系统收回,无法返回正确内容。接着介绍正确方法,即让指针指向字符串常量,将常量区地址返回,主程序可通过该地址获取字符串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:https://blog.youkuaiyun.com/luna_zhan/article/details/80433196

 

例如,定义一个函数,要求该函数能够返回一个指向字符串“I love C.”的指针并能在主程序中正确得到该字符串的内容。

对于初学者来说,当看到这个题目时,感觉并不难做到,可能很容易的写出下面形式的代码:

代码中定义了一个函数getString1,其目的是返回“I love C.”字符串。该函数返回值是char类型的指针,在函数内部定义了一个char类型包括20个元素的数组str并赋值为“I love C.”,然后返回数组的名称str,即字符串的地址。

乍一看,该函数写的没问题,似乎在主程序中调用该函数能得到正确的字符串内容“I love C.”,但实际上,这种方式并不能达到我们的目的。

其原因是,在函数内部定义的str数组是一个局部变量,将“I love C.”字符串存放在里面,当函数调用结束时,局部变量的内容将被操作系统自动收回,所以在主程序调用时,随着函数getString1调用的结束,其内部的str数组也就不存在了,自然也就不能将它里面20个元素的内容返回到主程序中了。

函数返回字符串指针的正确方法:

那么,如何在函数中正确返回字符串的内容呢?实际上,我们只要对上面的函数作一下修改,如下图所示就可以了:

该函数getString2同上面的getString1的区别是,在函数内部定义了一个指向char类型的指针p,该指针指向一个字符串常量“I love C.”,我们知道,这个字符串“I love C.”存放在整个程序的常量区,而并不是getString2的局部变量,也就是说,在程序整个的运行周期内,该字符串“I love C.”常量始终存在,并不会因为函数调用的结束而消失。

所以,指针变量p虽然是一个局部变量,但p本身的值仅仅是一个4个字节的指针地址值,这个地址值也就是“I love C.”的字符串的地址值。当函数调用结束时,虽然p局部变量不存在了,但可以将这个地址(仅4个字节)返回到主程序中,在主程序中通过这个地址值,我们是可以得到这个字符串“I love C.”的。

对比一下,字符串“I love C.”在getString1函数中存储在局部变量区,而在getString2函数中存储在整个程序的常量区,所以在getString2函数中将该常量区的地址返回,在主程序可以通过该地址得到这个字符串的内容。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值