把全部分押上,不够以后在补,关于C++字符串和动态内存问题.

dama2003 2003-10-19 09:38:40
#include<iostream>
using namespace std;
#include<cstring>
struct stringy{ //定义一个结构
char *str;
int ct;
};

void set(stringy a,char str[]);//动态分配内存

void show(char p[],int i=1);
void show(stringy p,int i=1);
main()
{
stringy beany;
char testing[]="Reality isn't what it used to be. ";

set(beany,testing);

show(beany);
show(beany,2);
testing[0]='D';
testing[1]='u';
show(testing);
show(testing,3);
show("Done! ");
delete [] beany.str;
return 0;
}

void set(stringy a,char str[])//为a.str分配足够的空间来存储字符串
{
a.str=new char[strlen(str)+1
a.str=str;
//for(a.ct=0;a.ct<(strlen(str));a.ct++)
//*(a.str+a.ct)=str[a.ct];
//*(a.str+a.ct)='\0';
strcpy(a.str,str);
//strcpy(a.str,p);
//strcpy(a.str++,p++);
//delete [] p;
}

void show(char p[],int i)//显示字符
{
if(i==1)
cout<<p[0]<<endl;
else
{ for(int m=0;m<i;m++)
cout<<p[m];
}
cout<<endl;
}

void show(stringy p,int i)//显示字符
{
//char *ps=p.str;
if(i==1)
cout<<*p.str<<endl;
else
{
for(int m=0;m<i;m++)
cout<<*(p.str+m);
}
cout<<endl;
}

没有错误,就是一个警告,G:\vc6\beany.cpp(18) : warning C4700: local variable 'beany' used without having been initialized
运行的时候就不行了,运行不出来,请高手指点:) 小弟先谢谢!~>>>>
...全文
30 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
grail0922 2003-10-19
  • 打赏
  • 举报
回复

在set()应该使用引用或者指针,因为并没有分配内存及初始化;

但在show()中通过传值传递结构变量是可以的。
ttlb 2003-10-19
  • 打赏
  • 举报
回复
当struct或class里含有指针成员的时候,千万要记得给他定义拷贝构造函数和拷贝赋值操作符,为了简单起见,我的程序中省略了拷贝赋值操作符的重载。
同时,千万不要再struct或class之外分配或者释放内存。
ttlb 2003-10-19
  • 打赏
  • 举报
回复
stringy 应该保证自己为自己分配内存,struct class 如果需要分配内存,需要在构造函数中进行,内存的释放应该在析构函数中进行。当含有指针成员时,还应该为struct class定义拷贝构造函数和拷贝赋值操作符。
可将stringy的定义修改如下:
struct stringy{ //定义一个结构
stringy(char *s)
{
str=new char[strlen(s)+1];
strcpy(str,s);
ct = 0;
};
stringy(const stringy& s)
{
str=new char[strlen(s.str)+1];
strcpy(str,s.str);
ct = 0;
}
~stringy()
{
delete [] str;
}
char *str;
int ct;
};
这样就不用set分配内存,main修改如下:
main()
{
char testing[]="Reality isn't what it used to be. ";
stringy beany(testing);

show(beany);
show(beany,2);
testing[0]='D';
testing[1]='u';
show(testing);
show(testing,3);
show("Done! ");
return 0;
}
JJZHK 2003-10-19
  • 打赏
  • 举报
回复
strcpy(a.str,str);有问题,
sizeof(a) = 8证明空间已经分配,但是拷贝时出错了。
dama2003 2003-10-19
  • 打赏
  • 举报
回复
不明白为什么传递结构对象就不可以,而传递结构指针就可以呢?
point_to 2003-10-19
  • 打赏
  • 举报
回复
#include<cstring>
struct stringy{ //定义一个结构
char *str;
int ct;
};

void set(stringy *a,char str[]);//动态分配内存

void show(char p[],int i=1);
void show(stringy *p,int i=1);
main()
{
stringy beany;
char testing[]="Reality isn't what it used to be. ";

set(&beany,testing);

show(&beany);
show(&beany,2);
testing[0]='D';
testing[1]='u';
show(testing);
show(testing,3);
show("Done! ");

cout<<beany.str<<endl;
delete []beany.str;
return 0;
}

void set(stringy *a,char str[])//为a.str分配足够的空间来存储字符串
{
a->str=new char[strlen(str)+1];
// a->str=str;//致命的一句话!
//for(a.ct=0;a.ct<(strlen(str));a.ct++)
//*(a.str+a.ct)=str[a.ct];
//*(a.str+a.ct)='\0';
strcpy(a->str,str);
//strcpy(a.str,p);
//strcpy(a.str++,p++);
//delete [] p;
}

void show(char p[],int i)//显示字符
{
if(i==1)
cout<<p[0]<<endl;
else
{ for(int m=0;m<i;m++)
cout<<p[m];
}
cout<<endl;
}

void show(stringy *p,int i)//显示字符
{
//char *ps=p.str;
if(i==1)
cout<< p->str<<endl;
else
{
for(int m=0;m<i;m++)
cout<<*(p->str+m);
}
cout<<endl;
}
freewing 2003-10-19
  • 打赏
  • 举报
回复
或者用指针也可以
freewing 2003-10-19
  • 打赏
  • 举报
回复
void set(stringy a,char str[]);//动态分配内存
改成
void set(stringy& a,char str[]);//动态分配内存
试试

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧