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



    正确计算c字符串的长度

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

    #include
    #include
    
    char * fun(){
    	char name1[]="cch";//改为char *name2="cch";不会报错
    	return name1;//return name2;
    }
    
    int main(){
    	fun();
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    # 编译结果显示如下:
    [cch@aubin s]$ gcc file.c
    file.c: 在函数‘fun’中:
    file.c:6:2: 警告:函数返回局部变量的地址 [-Wreturn-local-addr]
      return name;
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

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

    解决方法

    static关键字

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

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

    静态一直存在

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

    静态全局变量

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

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

    静态局部变量

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

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

    静态函数:

    • 使用:在函数返回类型前面加上static,修饰函数为静态函数
    • 作用:改变函数的可见性,函数的定义和声明在默认情况下都是extern的,但是静态函数只在声明他的文件中可见,不被其他的文件可见
    #include
    #include
    
    char * fun(){
    	static char name1[]="cch";//改为char *name2="cch";不会报错
    	return name1;
    }
    
    int main(){
    	fun();
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

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

    malloc动态分配内存

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

    #include
    #include
    
    char * fun(){
    	char *name1=(char *)malloc(10*sizeof(char));
    	name1="cch";
    	printf("%s\n",name1);
    	return name1;
    }
    
    int main(){
    	fun();
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

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

  • 相关阅读:
    Java基础static关键字
    (王道考研计算机网络)第四章网络层-第三节4:ARP、DHCP和ICMP
    机器学习---决策树分类代码
    带您了解ChatGPT强大功能!
    最长的可整合子数组的长度
    .NET应用如何防止被反编译
    QT 中 Graphics View 程序例子-Diagram Scene Example
    [C++11]可变参数模板和参数包展开
    【IVA】一个开源OPENIVAS智能分析系统的思考
    【ODPS 新品发布第 2 期】实时数仓 Hologres:推出计算组实例/支持 JSON 数据/向量计算+大模型等新能力
  • 原文地址:https://blog.csdn.net/CodePlayMe/article/details/133989522