它是指向对象的指针数组的基本程序。
#include <iostream>
using namespace std;
class city
{
protected:
char *name;
int len;
public:
city()
{
len=0;
name= new char[len+1];
}
void getname(void)
{
char *s;
s= new char[30];
cout<< "enter city name";
cin >> s;
len= strlen(s);
name = new char[len+1];
strcpy(name, s);
}
void printname(void)
{
cout<< name <<"\n";
}
};
编译器说问题出现在“cout&lt;&lt; name&lt;&lt;&lt;”\ n“;”“
int main()
{
city *cptr[10];
int n=1;
int option;
do
{
cptr[n]= new city;
cptr[n]->getname();
n++;
cout<< "continue? yes=1, no=0. select now?";
cin>> option;
}
while(option);
cout<< endl<< endl;
for (int i=1;i<=n;i++)
{
cptr[i]-> printname();
}
cin.ignore();
getchar();
return 0;
};
还有警告(此警告不是问题)
warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files\microsoft visual studio 10.0\vc\include\string.h(105) : see declaration of 'strcpy'
我尝试strcpy_s
删除警告,但这个词无法识别。
答案 0 :(得分:2)
cptr
是一个字符指针数组。并且数组的大小固定为10:
city *cptr[10];
这使0
到9
成为数组的有效索引。但是你的do-while循环不会执行此检查。如果用户通过输入1
继续继续,那么您将在数组之外进行写作。
C ++中的数组索引以0
开头而不是1
所以
for (int i=1;i<=n;i++)
应该是:
for (int i=0;i<n;i++)
并且
int n=1;
应该是
int n=0;
另请考虑使用strncpy
代替strcpy.
此外,您通过不释放分配给s
的内存来泄漏内存。您需要致电delete
:
char *s;
s= new char[30];
// use it
delete[]s;
答案 1 :(得分:1)
如果输入超过9
(我相信)条目,意味着你继续经过,你会覆盖内存,因为你继续在循环中递增索引而你没有检查你是否到达了数组的末尾,所以你将过去。
答案 2 :(得分:1)
你真的讨厌这个例子中的内存:)一旦你分配了内存,你必须释放它。
city::name
; city::getname()
中,您需要释放两次内存:
name
指针之前; cptr
返回之前释放为main()
分配的内存。答案 3 :(得分:0)
将i<=n
替换为...... {/ p>中的i<n
for (int i=1;i<=n;i++)