3
char ** Ptr;
char apple[15];
char cake[15];
Ptr = new char*[2];

Ptr[0]=apple;
Ptr[1]=cake;

残念ながら更新後Ptr[1]、おまけになりPtr[0]ます。問題は、本質的に文字列の配列にしたいと宣言した方法にあると確信しています。私が保管している場所でこれを行う方法はありますか?cakePtr[1]Ptrchar ** Ptr

編集:

{
char **Ptr;
{
char apple[15];
Ptr = new char*[2];
for(int k=0;k<2;k++)
{
memset(apple,0,15);
//apple=
Ptr[k]=apple; //Note that apple in fact changes everytime
}
//Originally I had Ptr[k]=apple but it seemed I was merely copying the address of  
//apple which works great except when I leave the scope trying to call it the addr no 
//longer exists and I was getting lucky the last entry showed up at all. So I then 
//figured I would use

strcpy(Ptr[k],apple);

//I then checked the value for both was correct even when I deleted apple.
// Finally I leave the scope where all this is taking place
}
cout<<Ptr[0];
cout<<Ptr[1];
}

幸いなことに、それらは実際には同等のゴミでした。最初の数文字は同じでしたが、ほとんどがゴミでした。おそらくスコープの問題だと思ったPtrので、基本的にはグローバルな同じ問題にしました。とにかく、別の変数を作成したので、誰もが親切に指摘してくれたので、問題は含まれていませんでしたが、元の問題を残しましたcake(おっと)。ただし、どんな助けでも大歓迎です。

とにかく、お時間をいただきありがとうございます。

4

2 に答える 2

1

編集した後でも、特にポインターとスコープが何であるかを理解しているように見えるため、何を意味するのかはまだ明確ではありません。

もう存在していて、最後のエントリがまったく表示されなかったのは幸運でした。だから私はそれから私が使うと思った

strcpy(Ptr[k],apple);

このように使用する場合、ヒープ上のすべてstrcpyにメモリを割り当てる必要があり、コードは問題なく動作します。 Ptr[k]

ただし、C++ でコーディングしているため、C++ の機能に固執することをお勧めします。つまり、 C のアプローチであるの配列とへのcharsポインタを割り当てる代わりに、次を使用します。chars

vector<string> Ptr;
{
    string apple;
    for(int k=0;k<2;k++)
    {
        //apple=
        Ptr.push_back(apple);
    }
}
cout<<Ptr[0];
cout<<Ptr[1];

ここでは、分かりやすくするために、変数の名前とコード構造を同じままにしていますが、Ptr明らかにポインタではありません。

于 2012-11-30T21:07:40.120 に答える
-3

Ptr = malloc(sizeof(char *) * 2);の代わりに使用Ptr = new char*[2];

于 2012-11-30T17:33:51.233 に答える