VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2563|回复: 17

一个入学者的问题,我整不明白了,大伙帮帮忙

[复制链接]

1

主题

4

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-1-25 22:40:01 | 显示全部楼层 |阅读模式
我写了一段这样的程序

        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
他们的内存位置每个怎么相差五位呢?我原来的试验都是相差四位的呀,一个计算机字长不是四字节吗?这是为什么?
回复

使用道具 举报

1

主题

4

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2020-2-15 21:15:01 | 显示全部楼层
大家帮帮忙呀,C的指针还真烦呀。
回复

使用道具 举报

0

主题

3

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-2-16 17:15:02 | 显示全部楼层
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;
回复

使用道具 举报

0

主题

7

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2020-2-16 18:45:01 | 显示全部楼层
z = "abcde";

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

strcpy(z, "abcde");
回复

使用道具 举报

2

主题

54

帖子

34.00

积分

新手上路

Rank: 1

积分
34.00
发表于 2020-2-16 19:45:01 | 显示全部楼层
char * z = new char[6];
=======================
这句你的z指向堆上分配的内存

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

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

使用道具 举报

2

主题

54

帖子

34.00

积分

新手上路

Rank: 1

积分
34.00
发表于 2020-2-16 21:15:01 | 显示全部楼层
解决方法
把指向的堆上的内存的指针保存
以便释放
char * z = new char[6];
char *p = z;//here
z = "abcde";
//...
delete[] p;//ok
回复

使用道具 举报

2

主题

54

帖子

34.00

积分

新手上路

Rank: 1

积分
34.00
发表于 2020-2-16 21:45:01 | 显示全部楼层
个人意见,高手多多指教
回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-3-3 11:45:01 | 显示全部楼层
第二个问题........
cout<<hex<<&z+k<<endl;输出的是数组z以外的地址.
回复

使用道具 举报

0

主题

4

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-3-7 18:45:01 | 显示全部楼层
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;
}
回复

使用道具 举报

1

主题

4

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
 楼主| 发表于 2020-4-15 18:15:01 | 显示全部楼层
那我该如何才能得到一个数组里面所有元素的地址呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表