char p[]与char *p的区别

本文通过两个C++函数示例,解释了字符数组与字面值常量在内存中的不同表现方式及其对程序运行结果的影响。第一个函数返回局部字符数组地址,导致未定义行为;第二个函数返回字面值常量地址,行为可预测。

如下程序:

char* GetMemory1()
{
char p[] = "Hello,World";
return p;
}

char* GetMemory2()
{
char *p = "Hello,World";
return p;
}

int main()
{
char *q,*r;
q = GetMemory1();

r = GetMemory2();

cout<<q<<endl;

cout<<r<<endl;
return 0;
}

其运行结果是什么?

答:乱码和"hello word",因为第一个函数的字符数组是动态变量,离开函数就会失效,所以虽然正确返回了该字符串的地址,但是该地址已经被释放,内容可能已经被修改了,所以是乱码(有些编译器下仍可以正确显示,但在VC6.0下为乱码),另外,对字符数组改为"static"类型就可以正确显示了。

第二个函数,是"Hello,World"是字面值常量,char* p指向她,所以不能改变她,会转化为const char* p,同时正确返回该字面值常量的地址,可以正确显示。

转载于:https://www.cnblogs.com/loopever/archive/2012/09/14/2684528.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值