这二题都有问题,但问题各不相同,请问char p[] 和 char *p 的存放位置?为什么? (栈区或静态区或堆等)

huabinsir 2009-02-02 04:50:22
这二题都有问题,但问题各不相同,请问char p[] 和 char *p 的存放位置?为什么? (栈区或静态区或堆等)


例1:

char *GetString( void )
{
 char p[] = "hello world";  return p; ////存放在栈区,可以理解.
}

void Test( void )
{
 char *str = NULL;
 str = GetString();
 printf( str );
}


例2:

char *GetString( void )
{
 char *p = "hello world"; ////存放的区域,理解不了.
 return p;
}

void Test( void )
{
 char *str = NULL;
 str = GetString();
 printf( str );
}
...全文
150 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
hrx1989 2011-03-07
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 lann64 的回复:]

先别管是存放在哪,首先搞清楚那两种定义的含义。

char p[] = "hello world"; //这里是定义一个局部数组p,p的内容初始化成"hello world"
char* p="hello world"; //这里是定义了一个指针p,p指向一个内容为"hello world"的常量字符串,对于这样的常量值,编译器会统一放到公共的常量区。

搞清楚含义了,两种写法的……
[/Quote]

谢谢楼上。了解了。但是还有一点想要问的是?
char *p = “hello world!”;
这些字符是存在常量区,是不是在代码段里面?
谢谢
lann64 2009-02-02
  • 打赏
  • 举报
回复
先别管是存放在哪,首先搞清楚那两种定义的含义。

char p[] = "hello world"; //这里是定义一个局部数组p,p的内容初始化成"hello world"
char* p="hello world"; //这里是定义了一个指针p,p指向一个内容为"hello world"的常量字符串,对于这样的常量值,编译器会统一放到公共的常量区。

搞清楚含义了,两种写法的问题就好理解了。
对于char p[]这样定义的局部变量,任何好一点的教材都会告诉你,不要返回局部变量的地址。
而对于char* p这样定义的指针,虽然p也是局部变量,离开函数p也会失效,但p指向的内容不是局部的,离开函数后这些内容依然存在、有效。所以把p的值返回后,接受的指针可以继续使用指向的内容。

Vegertar 2009-02-02
  • 打赏
  • 举报
回复
对于全局变量,它的一个特性就是定义时编译器会将存储区置0.
利用这一点可以这样测试:

#include <cassert>

char *p;

int main() {
assert(p == 0x00); // 运行时若无返回值,则p 是全局变量。
}
Vegertar 2009-02-02
  • 打赏
  • 举报
回复
const char *p; // p 是变量, const 修饰 char
const char *const p; // 此时 p 是常量, const 修饰 char 及 p
OenAuth.Net 2009-02-02
  • 打赏
  • 举报
回复
这篇文章我也已经发过很多次了,认真看完http://hi.baidu.com/anglecloudy/blog/item/c2b27045c5721020cefca33d.html
waizqfor 2009-02-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 huabinsir 的回复:]
引用 1 楼 waizqfor 的回复:
月经题又来了

char *p p是常量没有分配空间 所以字符串的内容存储在常量区 也就是只读类型的 不修改 用的是记得要用new或
malloc动态申请内存 再使用


char *p = "hello world";//申请一个字符串p,p是动态申请。


/////以上说法不理解.


void AAAAA( void )
{
 char *p ; //---->是不是局部变量? 是不是放在栈上?
}


char *GetString( void )
{
 c…
[/Quote]
其实吧 char *p = "hello world";这种写法 本身就是错误的 可是编译器不会报错 正确的写法应该是const char *p
这样就明朗许多了吧 p是常量 所以存储在常量区 只读型的
Vegertar 2009-02-02
  • 打赏
  • 举报
回复
void f() {
char *p; // p 为局部变量, 位于stack
}

char *g() {
char *p = "hello world"; // p 为局部变量, 位于stack. 这里char *p 相当于 const char *p
// "hello world"为常量集合, 位于常量区, 除非程序结束,否则不会注销。
}

char *p; // p 为全局变量, 位于静态区。

int main() {}
huabinsir 2009-02-02
  • 打赏
  • 举报
回复
引用 1 楼 waizqfor 的回复:
月经题又来了

char *p p是常量没有分配空间 所以字符串的内容存储在常量区 也就是只读类型的 不修改 用的是记得要用new或
malloc动态申请内存 再使用


char *p = "hello world";//申请一个字符串p,p是动态申请。


/////以上说法不理解.


void AAAAA( void )
{
 char *p ; //---->是不是局部变量? 是不是放在栈上?
}


char *GetString( void )
{
 char *p = "hello world"; ////--->为什么会放在静态区?
 return p;
}



great3779 2009-02-02
  • 打赏
  • 举报
回复
函数内部定义的指针,如果要做为返回值,必需是堆上的内存空间,即new出来的内存。如果是栈上的,仅做为临时存放,容易被覆盖而导致程序不稳定。
chenyingshu 2009-02-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 waizqfor 的回复:]
月经题又来了

char *p p是常量没有分配空间 所以字符串的内容存储在常量区 也就是只读类型的 不修改 用的是记得要用new或
malloc动态申请内存 再使用
[/Quote]

char *p = "hello world";//申请一个字符串p,p是动态申请。
ljmscsq 2009-02-02
  • 打赏
  • 举报
回复
char *p = "hello world";
这个应该存放在全局区域
例1应该返回显示不了正确结果。因为p是函数的局部变量,函数结束,p空间就被收回了。
例2是p是全局的。所以应该能返回正确字符串
waizqfor 2009-02-02
  • 打赏
  • 举报
回复
月经题又来了

char *p = "hello world";//申请一个字符串p p是常量没有分配空间 所以字符串的内容存储在常量区 也就是只读类型的 不修改 用的是记得要用new或
malloc动态申请内存 再使用

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧