c语言 char* 和char[]的返回值

文章目录

正确计算c字符串的长度

char* 和char[]的返回值报错的原因

c 复制代码
#include<stdio.h>
#include<stdlib.h>

char * fun(){
	char name1[]="cch";//改为char *name2="cch";不会报错
	return name1;//return name2;
}

int main(){
	fun();
	return 0;
}
复制代码
# 编译结果显示如下:
[cch@aubin s]$ gcc file.c
file.c: 在函数'fun'中:
file.c:6:2: 警告:函数返回局部变量的地址 [-Wreturn-local-addr]
  return name;

为什么name1会出现报错,但是name2不会出现报错

  • name1是fun函数内的局部变量,局部变量会保存在 中,随着fun函数的结束,其地址会被释放,所以name1返回的是无效地址;但是name2是保存在常量区的,在fun函数结束后,常量数据不会消亡,它会直到整个程序结束才消失,所以name2返回的是一个有效的地址。

解决方法

static关键字

怎么避免以上的问题,可以使用static关键字

  • static全局变量只能声明后再本文中调用
  • static局部变量只能声明后再本函数调用

静态一直存在

  • static全局变量生命周期到程序结束
  • static局部变量生命周期到程序结束

静态全局变量

使用:在全局变量前加static关键字,修饰全局变量为静态全局变量

作用:改变全局变量的可见性 :静态全局变量的存储位置在静态存储区,未被初始化的静态全局变量会被自动初始化为0。静态全局变量在声明他的文件之外的其他文件是不可见的,仅从定义变量的开始位置到文件结尾可见。

静态局部变量

使用:在局部变量前加static关键字,修饰局部变量为静态局部变量

作用:改变局部变量的销毁期 :静态局部变量的作用域与局部变量的作用域是一样的,都是当定义这个局部变量的那个函数或者语句块结束时候作用域结束。但是不同的是,静态局部变量存储在静态存储区 ,当静态局部变量离开作用域后,并没有被销毁当该函数再次被调用的时候,该变量的值为上帝函数调用结束时的值

静态函数:

  • 使用:在函数返回类型前面加上static,修饰函数为静态函数
  • 作用:改变函数的可见性 ,函数的定义和声明在默认情况下都是extern的,但是静态函数只在声明他的文件中可见,不被其他的文件可见
c 复制代码
#include<stdio.h>
#include<stdlib.h>

char * fun(){
	static char name1[]="cch";//改为char *name2="cch";不会报错
	return name1;
}

int main(){
	fun();
	return 0;
}

以上代码是可以正确运行的,因为name1为静态局部变量,虽然fun函数结束后其作用域消失,但是其name1存储在静态存储区,并没有随着作用域一起消亡,所以返回的是一个有效的地址。

malloc动态分配内存

malloc分配的内存是在上而不是在栈内存上的,所以可以使用动态分配内存的方式来解决问题。

c 复制代码
#include<stdio.h>
#include<stdlib.h>

char * fun(){
	char *name1=(char *)malloc(10*sizeof(char));
	name1="cch";
	printf("%s\n",name1);
	return name1;
}

int main(){
	fun();
	return 0;
}

值得注意的是:char[]类型可以直接给char *类型赋值;但是反过来,char *类型不能给char[]类型赋值,如果非要赋值,可以使用strcpy函数

相关推荐
showker几秒前
Mac mini-macOS Tahoe 26.1-安装ftp服务-用户名密码都对,就是提示530 login incorrect
linux·服务器·数据库
未来之窗软件服务4 分钟前
服务器运维(二十八)阿里云清理服务器瘦身降低漏洞风险—东方仙盟
linux·运维·服务器·仙盟创梦ide·东方仙盟
晨非辰2 小时前
Linux权限管理速成:umask掩码/file透视/粘滞位防护15分钟精通,掌握权限减法与安全协作模型
linux·运维·服务器·c++·人工智能·后端
夜颂春秋3 小时前
jmeter做压力测试
linux·运维·服务器·压力测试
lihui_cbdd7 小时前
AMBER 24 生产环境部署完全指南(5090可用)
linux·计算化学
叫我辉哥e18 小时前
### 技术文章大纲:C语言造轮子大赛
c语言·开发语言
生活很暖很治愈10 小时前
Linux基础开发工具
linux·服务器·git·vim
似霰11 小时前
Linux Shell 脚本编程——核心基础语法
linux·shell
进击的小头11 小时前
行为型模式:策略模式的C语言实战指南
c语言·开发语言·策略模式
爱编码的小八嘎12 小时前
C语言对话-5.通过任何其他名字
c语言