请高手详细解释一下(C )

[复制链接]
查看11 | 回复4 | 2011-3-17 07:26:41 | 显示全部楼层 |阅读模式
#include\"iostream.h\"

class base
{
public:
char *number[20];
int n;

base()
{n=0;}
void set(char *number1)
{

number[n]=number1;

n;
}
};
void main()
{
base b;
char *p=new char[20];
for(int i=0;i2;i)
{
cinp;
b.set(p);
coutb.numberendl;
coutb.number[0]endl;
}
}
为什么b.number[0]会随着每次输入p的改变而改变啊???,详细一点,拜托
回复

使用道具 举报

千问 | 2011-3-17 07:26:41 | 显示全部楼层
<pre id=\"best-answer-content\" class=\"reply-text mb10\">char *number[20];这是一个由20个字符指针组成的数组,注意你只定义了指针,没有分配容纳字符串的内存空间
number[n]=number1;这一句话把字符串指针指向了传入的字符串,连续执行的结果就把数组中的各个指针都指向了传入的字符串,这个字符串是什么呢?b.set(p);大家都是指向了p,所以,所有的字符串指针指向了同一个字符串,

所以每执行一次,b.number[0]都会改变,因为压根b.number[0]就不是一个独立的字符串,它其实就是个p

如果你每次都对p重新new char[20];就不会出现这个现象了,因为每个b.number[]都会指向不同的空间了

















<h4 class=\"ask\">追问





<pre class=\"replyask-text\" id=\"content-1883718\">谢谢,麻烦再请教你一下,为什么我把cinp;改成
if(i1)
p=\"qwe\";
else
p=\"123\";
这种直接赋值的方法b.number[0]就没有错呢?这样跟cinp有什么区别啊?
回复

使用道具 举报

千问 | 2011-3-17 07:26:41 | 显示全部楼层
<pre class=\"replyask-text\" id=\"content-1888325\">那是因为\"qwe\"和\"123\"在编译时作为const的字符串而存在,他们占用各自不同的空间,也就是说i1时的p值和i=1时的p值是不一样的。所以就没错了啊。

你注意new分配的空间,程序结束时要用delete释放,否则会造成内存泄露
回复

使用道具 举报

千问 | 2011-3-17 07:26:41 | 显示全部楼层
<pre class=\"replyask-text\" id=\"content-1888943\">如果我每次都对p重新new char[20],那最后是不是分配了很多次内存啊?等下要怎么delete?
回复

使用道具 举报

千问 | 2011-3-17 07:26:41 | 显示全部楼层
<pre class=\"replyask-text\" id=\"content-1890415\">当然不能直接new赋值给p,那样原先申请的内存就丢失了,一种方式是你给b.number分配好空间,比如初始化时b.number每个元素分配一段内存,set函数中改成strcpy复制p的内容,这样析构函数中,把他们全部delete掉。 或者直接使用字符串数组,而不是指针数组,把number搞成20个元素的字符串数组,每个字符串包含若干字节。这样不用new,也就不用delete了
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行