我认为一边进入无限循环。或阵列。 (运行时错误)

时间:2011-12-20 06:54:22

标签: c++ visual-c++ pointers do-while

它是指向对象的指针数组的基本程序。

#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删除警告,但这个词无法识别。

4 个答案:

答案 0 :(得分:2)

cptr是一个字符指针数组。并且数组的大小固定为10:

city *cptr[10];

这使09成为数组的有效索引。但是你的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)

你真的讨厌这个例子中的内存:)一旦你分配了内存,你必须释放它。

  1. 您需要声明析构函数,以释放city::name;
  2. 指向的内存
  3. city::getname()中,您需要释放两次内存:
    • 在重新分配name指针之前;
    • 方法返回之前;
  4. 最后,您需要在从cptr返回之前释放为main()分配的内存。

答案 3 :(得分:0)

i<=n替换为...... {/ p>中的i<n

for (int i=1;i<=n;i++)