标签:style blog http color io 使用 ar strong 数据
本文来源于网络 出处:点我
有这样一段代码:
#include "stdio.h" char *get_string_1() { char p[] = "hello world!"; return p; } char *get_string_2() { char *p = "hello world!"; return p; } int main() { char *p; p = get_string_1(); printf("get_string_1:%s/n",p); p = get_string_2(); printf("get_string_2:%s/n",p); return 0; }
输出:
get_string_1:(乱码或者没有输出,linux下没有任何输出)
get_string_2:hello world!
1.为什么输出结果是这样?
2.字符串"abc"是常量吗?
3.char *p = "abc";这样写到底合不合法,实际应用中能不能这样写?
解析:
char *p = "hello world!";与char p[] = "hello world!"; 两者都用来声明一个字符串,并将其初始化为hello world!,但是表示的意义确是大不相同。
从其声明的对象来说:
char p[] = "hello world!"; //用来声明一个数组p,数组大小为12字节。
char *p = "hello world!"; //用来声明一个指针p,指向“hello world!”字符串起始位置。
从存储位置来说:
char p[] = "hello world!"; //p数组作为局部变量被存储在栈区;
char *p = "hello world!"; //在这个声明中,"hello world!"被存储在静态数据区 ,而且是全局的,p仅仅就是个指针,指向这个区域。不信的话可以试试下边的代码,看是不是同一个地址:
char *p1 = "hello world!";
char *p2 = "hello world!";
printf("p1:%x/np2:%x/n",p1,p2);
第一个问题:为什么输出结果是这样?
由于C函数执行完之后对栈区进行清除操作,对静态数据区和堆则没有,因此get_string_1()函数执行完就释放了栈区内存,所以根本就不存在存有"hello world!"声明时的内存,也就不可能有所输出。
char *p="abc" 与 char p[]="abc" 的区别
标签:style blog http color io 使用 ar strong 数据
原文地址:http://www.cnblogs.com/yangtze736-2013-3-6/p/3960025.html