"); //-->
首先先看下下面的代码:
#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";这里的数据是存放在用户的数据储存区的,因为这里我是子函数中定义的,所以在子函数调用结束以后就不能在引用该变量,同时虽然我也返回了该数组的地址,但是在子函数调用结束后,数据储存区的空间可以被其他的变量占用了,所以你想再访问就访问不到了,即使你访问到了也是很偶然的,这里我也试了一下,可以访问到情况就是没有调用其他的函数或者没有开辟新的数据空间。其实这一点也是很容易理解的,在一个子函数中定义的变量在函数调用结束后都要释放的。其实这一点也是很容易理解的,在一个子函数中定义的变量在函数调用结束后都要释放的。其实这一点也是很容易理解的,在一个子函数中定义的变量在函数调用结束后都要释放的。其实这一点也是很容易理解的,在一个子函数中定义的变量在函数调用结束后都要释放的。其实这一点也是很容易理解的,在一个子函数中定义的变量在函数调用结束后都要释放的。其实这一点也是很容易理解的,在一个子函数中定义的变量在函数调用结束后都要释放的。其实这一点也是很容易理解的,在一个子函数中定义的变量在函数调用结束后都要释放的。
上面所说的也算是这两个很大的不同吧!总的来说字符串指针定义的字符串都是放在用户程序存储区的,而字符串数组是放在用户数据区的,这里总结的仅供参考,呵呵!
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。