您现在的位置是:首页 > 信息 > 正文
c语言static关键字的作用(C语言static变量特性)
发布时间:2024-01-18 17:15:07编辑:房昌勇来源:
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的范围如何处理等等,虽然是小细节,但却十分重要,大家有兴趣可以思考下练练手。
本文就为大家讲解到这里,希望对大家有所帮助。
标签:
疑病症有哪些特征 疑病症的主要症状有哪些 下一篇
最后一页
猜你喜欢
- 放屁多是哪几种疾病的前兆 放屁多不是好事
- 荣耀50se手机怎么样值得买吗(当下流行的高颜值手机)
- 公务员2022年工资待遇调整方案 优于公务员的三个)
- 全国今年高考时间2022具体时间(2022年高考时间公布
- 城寨英雄各个人物结局(城寨大结局牙佬朝霞温馨镜头被消失)
- 古代让官员回家洗澡的假期叫什么 关于古代让官员回家洗澡的假期
- 低温恒温烤箱 高温烤箱怎么使用比较安全)
- 魔兽狼人种族天赋解析 魔兽世界狼人适合什么职业
- 十大耐看的北京故事电视剧(戳中无数北漂青年膝盖的超现实电视剧)
- 单反相机入门选什么好(十个单反选购技巧)
- 众星拱月的意思是什么 众星拱月解释及出处介绍
- 逆境成才的名言警句(有关逆境成才的句子
- 山西地图全图最新版 山西新版地图来啦)
- 网上能买到哪些好的鲜花店 为什么越来越多的人又开始去实体店买鲜花了
- u盘怎么快速加密 你需要选对方法
- 圣墟最新复更消息(圣墟连更三天黎龘回归
- 胡歌近况结婚没(胡歌官宣喜得千金
- 罪的组词 罪的组词有哪些
- practise是什么意思 practise的中文意思
- 黑龙江省东宁是县还是市(黑龙江省牡丹江市)
最新文章
- c语言static关键字的作用(C语言static变量特性)
- 世界工业强国的高端制造比较 高端制造业崛起)
- 道教四大名山是哪四山(道教四大名山的简介
- 绿佳电动车2022年新款 绿佳新款电动车评测
- 10种面条的做法简单实用一次学会 5种面条好吃的做法
- 疑病症有哪些特征 疑病症的主要症状有哪些
- 三星堆的青铜面具简介 实拍三星堆青铜面具)
- 历史上的四川美术学院(盘点院校前身之四川美术学院)
- 手机显示e网什么原因(为什么手机上显示E网)
- 王姿允婚姻家庭(十年演戏无人知)
- 广州地铁13号线二期最新线路图(开门红广州地铁10条)
- 石友三是怎么死的 最反复无常的石友三下场怎样)
- 北京鸟巢建造史(耗资23亿建成的鸟巢)
- 芪怎么读拼音(关于芪的解释
- 十款值得买的摩托车头盔 性价比极高的4个摩托车头盔
- 戴维斯原来赢这么简单 何为戴维斯双击)
- 阿里巴巴达摩院有多强大 阿里巴巴的达摩院)
- 三十六种香辛料的特点用途 香辛料有哪些分类)
- 最好的询盘方式 高效又高能的询盘
- 古龙群侠传官方攻略(古龙群侠传八大系统详细说明攻略)
- 豆豆三部曲深度解读(豆豆三部曲之背叛
- 适合国内的亲子游(假期最适合带宝宝亲子游的好去处
- 我不配歌词 我不配完整歌词
- 有名的巾帼英雄 史上五位巾帼英雄排行