"); //-->
首先先看下下面的代码:
#include"stdio.h"
char* myfun(void)
{
char* str = "This is a test";
return str;
}
int main()
{
printf("%s\n",myfun());
}
我这边运行的环境是C-free4.0,运行后的结果就是:This is a test
如果把上面自己定义的myfun函数中的字符指针改写成字符数组
#include"stdio.h"
char* myfun(void)
{
char str[] = "This is a test";
return str;
}
int main()
{
printf("%s\n",myfun());
}
这样运行下来结果就不是:This is a test
一开始没有弄明白这个是为什么,看了下谭浩强编写的C语言教程里面也说了字符数组和字符指针的区别,里面有一点我觉得说的不够好,字符数组也是按照字符指针来处理,因为我们知道数组名就是指的该数组开辟的内存空间的首地址,所以理论上上面的两种方法运行后的结果应该是一样的,为什么最后的结果会不一样呢。
经过自己的一些调试工作,发现字符指针定义的字符串char* str = "This is a test"; 这些字符串数据是存在用户的程序存储区的,不知道其他的编译环境下是不是,我想应该是的,我试了两个编译环境,大家都是程序存储区的数据是只能供程序运行时候读的。所以这里我觉得只要在一个程序中,不管是在哪里定义的字符指针定义的字符串都一直保留在用户程序存储区的,只要程序没有执行完毕,一直是可以通过该地址访问里面的数据。
而字符串数组char str[] = "This is a test";这里的数据是存放在用户的数据储存区的,因为这里我是子函数中定义的,所以在子函数调用结束以后就不能在引用该变量,同时虽然我也返回了该数组的地址,但是在子函数调用结束后,数据储存区的空间可以被其他的变量占用了,所以你想再访问就访问不到了,即使你访问到了也是很偶然的,这里我也试了一下,可以访问到情况就是没有调用其他的函数或者没有开辟新的数据空间。其实这一点也是很容易理解的,在一个子函数中定义的变量在函数调用结束后都要释放的。其实这一点也是很容易理解的,在一个子函数中定义的变量在函数调用结束后都要释放的。其实这一点也是很容易理解的,在一个子函数中定义的变量在函数调用结束后都要释放的。其实这一点也是很容易理解的,在一个子函数中定义的变量在函数调用结束后都要释放的。其实这一点也是很容易理解的,在一个子函数中定义的变量在函数调用结束后都要释放的。其实这一点也是很容易理解的,在一个子函数中定义的变量在函数调用结束后都要释放的。其实这一点也是很容易理解的,在一个子函数中定义的变量在函数调用结束后都要释放的。
上面所说的也算是这两个很大的不同吧!总的来说字符串指针定义的字符串都是放在用户程序存储区的,而字符串数组是放在用户数据区的,这里总结的仅供参考,呵呵!
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
小型CLA的技术概述
买ARM开发板,赠送ARM校园版开发工具
南方牌125型摩托点火器
嵌入式处理器(MUC/DSP/Sensor)设计应用 Freescale 论文集 (多篇技术应用好文)
ARM9开发经验(英文)推荐
2026年半导体行业趋势观察(Part 6)—中国半导体市场在分化中迎来高速增长
VxWorks体系下PowerPC860处理器串行总线设计
三星可能在下个月开始为英伟达量产HBM4芯片
黑人吸血鬼(暴笑)
使用DRV8312 Eval Kit的无传感器磁场定向控制
电机控制和PFC开发套件概述
JTAG在ARM调试技术中的应用
免费申请校园版光盘
“无克隆”的变通办法可以实现量子云
5G无线远程信息处理技术面向自动驾驶和软件定义车辆
美国工匠牌电动钉枪机(三)
基于Windows CE.NET的ARM9综合开发平台的研究与设计
ZT-90型助听器
美国工匠牌电动钉抢机(一)
高电压与低电压的控制器的测量
旋转三相无刷电机_ DRV8312 EVAL KIT
CG1-30型自动气割机
从2025年国民经济运行情况看2026年市场变化趋势
激光、雷达、梳状和增强原子能够实现精确的太赫兹测量
Microsoft发布第二代AI推理芯片Maia 200
中国的热电池突破可能会改变一切
机器人正在接管人类劳动力产业,先是现代的工厂
处理器电源管理解决方案设计要点
TI 的AWR2188 4D成像雷达发射器
ARM 认证培训正在热烈招生!