Я думаю, что делать, пока идет в бесконечный цикл. или массив. (ошибка выполнения) - PullRequest
1 голос
/ 20 декабря 2011

это базовая программа для массива указателей на объекты.

#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 << name <<" \ n ";" </p>

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 ]

2 голосов
/ 20 декабря 2011

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 голос
/ 20 декабря 2011

Вы действительно ненавидите память в этом примере :) После выделения памяти вы ДОЛЖНЫ освободить ее.

  1. Вам нужно объявить деструктор, где вы будете освобождать память, указанную city::name;
  2. В city::getname(), вам нужно освободить память дважды:
    • передвы переназначаете указатель name;
    • до возврата метода;
  3. И, наконец, вам необходимо освободить память, выделенную для cptr, прежде чем вернуться из main().
1 голос
/ 20 декабря 2011

Если вы вводите более 9 (я полагаю) записей, то есть вы продолжаете проходить мимо, вы перезаписываете память, потому что продолжаете увеличивать индекс в цикле, и вы не проверяете, достигли ли вы конца массива, поэтому вы пройдете .

0 голосов
/ 20 декабря 2011

Заменить i<=n на i<n in ...

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