一个入学者的问题,我整不明白了,大伙帮帮忙
我写了一段这样的程序
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;
试试就知道了。