用字符串常量初始化指针和数组

       定义指针时,编译器并不为指针所指的对象分配空间,它只是分配指针本身的空间,除非在定义时同时赋给指针
一个字符串常量进行初始化。例如,下面的定义创建一个字符串常量(为其分配内存):
char*p=“breadfruit”;
注意只有对字符串常量才是如此。不能指望为浮点数之类的变量分配空间,如:
float *pip=3.14; /*错误,无法通过编译*/
在ANSIC中,初始化指针时所创建的字符串常量被定义为只读。如果试图通过指针修改这个字符串值,程序会
出现未定义的行为。在有些编译器中,字符串常量被存放在只允许读取的文本段中,以防止它被修改。
数组也可以用字符串常量进行初始化:
chara[]=“gooseberry”;
与指针相反,由字符串常量初始化的数组是可以修改的。比如下面的语句:
strncpy(a,“black”, 5);
将数组的值修改为“blackberry”。

更重要的是用字符串初始化指针时,此时的字符串是放在静态存储区的,而用字符串来初始化数组,此时的字符串却是局部变量。

下面看一下我写的程序来验证:

#include <iostream>
#include <assert.h>
using namespace std;
char *px;
char* fun(char *p1)
{
	p1[0] = 'c';
	char str[] = "eabd";
	return str;
}

void f2()
{
	char *p = "aaaaaaa";
	char pp[] = "aa";
	px = pp;
	pp[1] = 'c';
	//p[1] = 'c'; //编译没错,但是运行时会出现异常。

	cout<<fun(pp)<<endl;
	cout<<pp<<endl;
}
void main()
{
	px = NULL;
	assert(NULL != px);
	f2();
	if(NULL != px)
		cout<<px<<endl;
}


此时最后一句话输出为乱码。即可证明此时px指向的内存无效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值