C++系列之-----字符串变量的内存分布

前段时间看了一个面试题,程序找错误:

char *str()
{
	char p[] = "hello world!";
	return p;
}

以前一直把数组名和指针看作一个东西,况且指针指向的是常量字符串,常量字符串保存在内存的静态数据区,函数结束不会释放的,错误认为,此程序没有错误,可以正确返回字符串。

在vc 6.0中编译运行时,输出的是乱码。

度娘了一把,现在把这个过程理顺清楚了,陈述如下:

常量字符串确实保存在内存的静态数据区,函数结束时不会释放。但是,此函数中的常量字符串赋值给了一个局部数组,函数结束时,数组释放,于是不能得到函数返回值。常量字符串一份保存在静态数据区,一份被拷贝到局部数组中。

引起我迷惑的地方主要在:字符数组名不能简单看作就是字符指针。

为了使此函数正常运行,可以做如下两种修改:

static char *str()
{
	static char p[] = "hello world!";
	return p;
}//静态数组保存在内存的静态数据区,函数结束不会释放
char *str()
{
      char *p = "hello world!";
      return p;
}//返回的是指针的值,也就是静态数据区中字符串的地址,函数结束不会释放


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值