读书人

一个入学者的有关问题小弟我整不明白

发布时间: 2012-02-25 10:01:49 作者: rapoo

一个入学者的问题,我整不明白了,大伙帮帮忙
我写了一段这样的程序

char * z = new char[6];
z = "abcde ";
for(int k=0; k <5; k++)
{
cout < <hex < <&z+k < <endl;
cout < <*(z+k) < <endl;
}

delete [] z;

前面运行都挺正常,然后到了delete [] z;那儿,就运行不下去了,这是什么原因啊?我估计是跟那个const有点关系,请各位帮帮忙。

然后呢,为了把这段程序运行下去,我这样写了:

char z[] = { 'a ', 'b ', 'c ', 'd ', 'e '};

for(int k=0; k <5; k++)
{
cout < <hex < <&z+k < <endl;
cout < <*(z+k) < <endl;
}

不用delete了,就没有错了,但我突然发现一个奇怪的现像。这是它的输出结果:
0012FF24
a
0012FF29
b
0012FF2E
c
0012FF33
d
0012FF38
e
他们的内存位置每个怎么相差五位呢?我原来的试验都是相差四位的呀,一个计算机字长不是四字节吗?这是为什么?


[解决办法]
char * z = new char[6];
z = "abcde "; //指向了其它地方了......你不是用你动态分配的内存了保存 "abcde "
//strcpy(z, "abcde ");//这样就好
for(int k=0; k <5; k++)
{
cout < <hex < <&z+k < <endl;
cout < <*(z+k) < <endl;
}

delete [] z;
[解决办法]
z = "abcde ";

把z的指针改了,delete时当然会出错。

strcpy(z, "abcde ");

[解决办法]
char * z = new char[6];
=======================
这句你的z指向堆上分配的内存

z = "abcde ";
======
这句你把z指向了别的地方

delete [] z;
======
这句你想释放堆上的内存,可是z不指向堆上内存了,所以

[解决办法]
解决方法
把指向的堆上的内存的指针保存
以便释放
char * z = new char[6];
char *p = z;//here
z = "abcde ";
//...
delete[] p;//ok
[解决办法]
第二个问题........
cout < <hex < <&z+k < <endl;输出的是数组z以外的地址.
[解决办法]
for(int k=0; k <5; k++)
{
cout < <hex < <&z+k < <endl; // &z指向一个其类型为char[5]的数据结构的地址,&z+k的值实际上等于
// z的地址+sizeof(char[5])*k
cout < <*(z+k) < <endl;
}

[解决办法]
delete 是用来针对堆内存的释放的
所以1:
char * z = new char[6];
delete [] z;
可以

所以2:
z = "abcde ";
这个时候,因为 "abcd "是不再是申请了堆内存,
delete[]z
错误

个人观点,呵呵!!

[解决办法]

cout < <hex < <&z+k < <endl;

改成:
cout < < hex < < &z[k] < < endl;
[解决办法]
htqx(航天奇侠) 兄:
cout < <hex < <&z+k < <endl;

改成:
cout < < hex < < &z[k] < < endl;

没有弄明白几不要滥发贴,
偶认为至少要动手调试一下才有发言权
要不然很容易误导大家

对于楼主的第二个问题, mlwu3(wml) 兄是正解
&z+k 是根本没有意义的一个地址
要想取得数组里面所有元素的地址,只需把取地址符号&去掉即可
因为z本身代表的就是数组的首地址


cout < <hex < <z+k < <endl;
[解决办法]
向shen8() 说Sorry,你也是对的,航天奇侠也是对的:


char z[]= "abcde ";
for(int k=0; k <5; k++)
{
cout < <hex < <(int*)(z+k) < <endl;//经测试,要输出地址,必须将char*型地址转换为int*,不然就输出字符.
cout < <hex < <(int*)&z[k] < <endl;//航天奇侠
cout < <z[k] < <endl;
}
[解决办法]
楼主cout < <typeid(&z+k).name() < <endl;
cout < <typeid(*(z+k)).name() < <endl;
试试就知道了。

读书人网 >C++

热点推荐