c语言static关键字的作用(C语言static变量特性)
hello大家好,我是城乡经济网小晟来为大家解答以上问题,c语言static关键字的作用(C语言static变量特性)很多人还不知道,现在让我们一起来看看吧!
有这样一道题目:用C/C 语言实现一个函数,给定一个int类型的整数,函数输出逆序的整数对应的字符串,例如输入1234,则输出字符串"4321",,输入-1234,则输出字符串"-4321"题目要求,不使用标准库,以及不能分配动态内存当时觉得蛮简单的,这不就是类似字符串逆转嘛,纸上得来终觉浅,绝知此事要躬行,自己尝试做了一下,发现还是有一些地方值得注意今天在此整理一下常见的坑,巩固下基础东西,接下来我们就来聊聊关于c语言static关键字的作用?以下内容大家不妨参考一二希望能帮到您!
c语言static关键字的作用
有这样一道题目:用C/C 语言实现一个函数,给定一个int类型的整数,函数输出逆序的整数对应的字符串,例如输入1234,则输出字符串"4321",,输入-1234,则输出字符串"-4321"。题目要求,不使用标准库,以及不能分配动态内存。当时觉得蛮简单的,这不就是类似字符串逆转嘛,纸上得来终觉浅,绝知此事要躬行,自己尝试做了一下,发现还是有一些地方值得注意。今天在此整理一下常见的坑,巩固下基础东西。
版本一
算法思路其实很简单:使用对10取余和除法操作依次获取每一位的数字,然后根据ASSIC码转换为字符,将结果存放在一个char型数组中,最后返回字符串数组结果,如下所示:
#include<stdio.h>//版本一const char * reverseInt(int n){ char str[16] = {0}; int temp = n; int i = 0; if (n < 0) { temp = -n; str[i ] = '-'; } //当temp除到是一位数的时候退出 while (0 != temp / 10) { char ch = temp % 10 48; temp = temp / 10; str[i ] = ch; } //处理原始数据的最高位 str[i ] = temp % 10 48; return str;}int main(int argc, char **agrv){ int test_data1 = 12345; int test_data2 = 789; printf("[test_data1] %d--->%s\n", test_data1, reverseInt(test_data1)); printf("[test_data2] %d--->%s\n", test_data2, reverseInt(test_data2)); return 0;}
发现编译出现了警告,如下:
[root@epc.baidu.com ctest]# gcc -g -o test test.ctest.c: In function 'reverseInt':test.c:24:2: warning: function returns address of local variable [-Wreturn-local-addr] return str; ^
从编译器给出的信息很清楚的说明了问题:返回了一个局部变量的地址,但是我们知道,函数的局部变量是存在stack中的,当这个函数调用过程结束时,这个局部变量都是要释放掉的,自然就不可再使用了,所以就会产生这样的warning,这个是和变量的生命周期相关的。
版本二
对于版本一存在的问题,很自然的会想到有两种解决方案,第一:使用malloc分配动态内存存放结果,但是题目中明确说明不能不能分配动态内存。因此自然排除掉。第二种方案就是将char result[16]改为static型:static char result[16];对,就是这么一点改动。
#include<stdio.h>//版本二const char * reverseInt(int n){ static char str[16] = {0}; int temp = n; int i = 0; if (n < 0) { temp = -n; str[i ] = '-'; } //当temp除到是一位数的时候退出 while (0 != temp / 10) { char ch = temp % 10 48; temp = temp / 10; str[i ] = ch; } //处理原始数据的最高位 str[i ] = temp % 10 48; return str;}int main(int argc, char **agrv){ int test_data1 = 12345; int test_data2 = 789; printf("[test_data1] %d--->%s\n", test_data1, reverseInt(test_data1)); printf("[test_data2] %d--->%s\n", test_data2, reverseInt(test_data2)); return 0;}
运行结果如下:
[root@epc.baidu.com ctest]# ./test [test_data1] 12345--->54321[test_data2] 789--->98721
从运行结果上看,第一个测试数据其结果是正确的,但是第二个输出结果确实错误的。这是什么原因?先来回一下用static修饰所修饰的局部变量(也称静态局部变量)特点,如下:
1:静态局部变量定义时未赋初值,则默认初始化为0;
2:静态局部变量其作用域为函数或代码块,其生命周期为整个程序的运行期间;注意这两个概念不要混淆;
3:在一个进程的运行期间,静态局部变量只会初始化一次,就是第一次调用该静态局部变量所在函数的时候初始化,此后再调用不会初始化。
好了,到这里,其实问题的原因已经很明显了:在上面程序中,static char str[16] = {0}只会初始化一次,既在执行reverseInt(test_data1)时初始化,执行完该语句,将结果存放到str中,此时str中的内容为54321,既str[16] = {'5','4','3','2','1','\0'};当再次对第二个测试数进行转换调用reverseInt(test_data2)时,str仍然是上次的结果{'5','4','3','2','1','\0'},因此在转换后为98721。
版本三
那么如何解决版本二的问题了,一个很简单的办法就是在reverseInt函数中对static变量str每次使用for循环进行初始化,如下,鉴于篇幅,就不将main函数也贴出来了:
const char * reverseInt(int n){ static char str[16] = {0}; int temp = n; int i = 0; int j = 0; for (; j < 16; j ) { str[j] = '\0'; } if (n < 0) { temp = -n; str[i ] = '-'; } //当temp除到是一位数的时候退出 while (0 != temp / 10) { char ch = temp % 10 48; temp = temp / 10; str[i ] = ch; } //处理原始数据的最高位 str[i ] = temp % 10 48; return str;}
运行,能得到我们期望的结果了:
[root@epc.baidu.com ctest]# ./test [test_data1] 12345--->54321[test_data2] 789--->987
其实,版本三还有很多细节需要考虑的,比如:当输入的整数超过int的范围如何处理等等,虽然是小细节,但却十分重要,大家有兴趣可以思考下练练手。
本文就为大家讲解到这里,希望对大家有所帮助。
免责声明:本文由用户上传,与本网站立场无关。财经信息仅供读者参考,并不构成投资建议。投资者据此操作,风险自担。 如有侵权请联系删除!
-
传祺GS3试驾:线上+线下全攻略广汽传祺GS3凭借时尚设计与强劲性能,成为SUV市场中的热门车型。无论是线上了解...浏览全文>>
-
2024款安徽淮南威然的最新价格已经公布,各配置车型的售价信息如下:2024款威然330TSI商务版指导价:28 68万...浏览全文>>
-
淮南途锐新能源车的落地价分析如下:途锐新能源作为大众旗下的高端插电混动SUV,以其强劲的动力和豪华配置吸引...浏览全文>>
-
2023款大众探影在安徽阜阳地区的最新报价现已出炉,为计划购车的朋友带来实惠。作为一款小型SUV,探影凭借时尚...浏览全文>>
-
近日,滁州地区2025款高尔夫的市场价格吸引了众多消费者的关注。根据最新数据显示,近一个月以来,该款车型的...浏览全文>>
-
QQ多米落地价:各配置车型售价一览奇瑞QQ多米作为一款备受关注的小型电动车,凭借其亲民的价格和实用的配置,...浏览全文>>
-
2025款途锐作为大众旗下的豪华SUV,以其强劲的动力、卓越的性能和高端配置吸引了众多消费者的目光。目前市场上...浏览全文>>
-
淮南途锐新能源2024款即将上市,作为大众旗下的高端SUV车型,途锐新能源以其卓越的性能和豪华配置赢得了广泛好...浏览全文>>
-
近日,阜阳地区传来好消息,2025款途锐正式到店,最低售价仅为55 88万元起。作为大众旗下的豪华SUV车型,途锐...浏览全文>>
-
近期,安徽淮南地区的探影车型迎来了一波购车优惠,最低售价仅需11 59万元起,对于预算有限但又想拥有一辆高...浏览全文>>
- 安徽淮南威然最新价格2024款,各配置车型售价全知晓
- 滁州高尔夫 2025新款价格走势,近一个月最低售价10.68万起,性价比凸显
- 滁州途锐新款价格2025款多少钱?买车攻略一网打尽
- 安徽淮南探影落地价,最低售价11.59万起,入手正当时
- 安徽淮北高尔夫多少钱 2025款落地价限时特惠,最低售价12.99万起,错过不再有
- 安徽阜阳途昂最新价格2025款,各配置车型售价全知晓
- QQ多米价格,最低售价5.99万起,入手正当时
- 安徽淮南高尔夫多少钱 2025款落地价大起底,买车超详细
- 安徽淮南ID.4 X最新价格2025款全解买车必看
- 阜阳途锐新能源多少钱?报价解析,配置全面升级
- 比亚迪唐新能源预约试驾,如何在4S店快速预约?
- 安徽阜阳途观L落地价全解,买车必看的省钱秘籍
- 阜阳ID.4 X多少钱?最低售价13.99万起,性价比大揭秘
- 领克900试驾怎么预约
- 试驾本田CR-V,如何享受4S店的专业服务?
- 池州ID.6 X新款价格2023款多少钱?买车攻略一网打尽
- 生活家PHEV落地价,各配置车型售价一目了然
- 亳州大众CC价格,换代前的购车良机,不容错过
- 蚌埠途安L新车报价2022款大起底,买车超详细
- 奥迪e-tron GT试驾,如何享受4S店的专业服务?