1

これは、オブジェクトへのポインタの配列の基本的なプログラムです。

#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";」にあると言います

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

4 に答える 4

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;
于 2011-12-20T07:02:36.617 に答える
1

この例では、メモリが本当に嫌いです:)メモリを割り当てたら、解放する必要があります。

  1. が指すメモリを解放するデストラクタを宣言する必要がありますcity::name
  2. ではcity::getname()、メモリを 2 回解放する必要があります。
    • nameポインタを再割り当てする前に;
    • メソッドが戻る前。
  3. cptr最後に、から戻る前に、 に割り当てられたメモリを解放する必要がありますmain()
于 2011-12-20T07:17:15.477 に答える
1

より多くの9(私が信じている)エントリを入力すると、過去に進み続けることを意味し、ループ内でインデックスをインクリメントし続け、配列の最後に到達したかどうかをチェックしていないため、メモリを上書きします。

于 2011-12-20T07:04:28.307 に答える
0

i<=nで置き換えi<nます...

for (int i=1;i<=n;i++)
于 2011-12-20T07:00:44.643 に答える