2017-07-03 7 views
1

C++コードを調べるときに、開発者がchar**変数に新しいセルを追加しようとしている行が出てきました。そうしている間、新しいセルにメモリを割り当てるために使用しているコード行は次のとおりです。 plantValuechar**plantCountあるC++でchar *にメモリを割り当てる

*(plantValue + (plantCount-1)) = (char *) malloc(sizeof(char) * SAPPlantStr.length()); 

は整数です。

誰かが私にそれを理解することができないので上記のコード行を説明してもらえますか?

ありがとうございます。

   +----------+ 
plantValue --> | char * | --> String #1 
(char **)  +----------+ 
       | char * | --> String #2 
       +----------+ 
       | ... | 
       +----------+ 
       | char * | --> String #N 
       +----------+ 

ので、そのコードは基本的にmalloc()を使用して、新しいCスタイルの文字列を割り当てている。

+8

の長さと、割り当てられたメモリへのポインタが含まれ、式 '*(P + I)は'に等しいです'p [i]'。具体的には、 '(plantValue +(plantCount-1))'が 'plantValue [plantCount-1]'に等しいことを意味します。うまくいけば、それはあなたのためにそれを明確にする必要があります。 –

+4

また、C++を学ぶためにそれを使用すると、おそらくそのコードを放棄するべきです。 "適切な" C++は、文字列に['std :: string'](http://en.cppreference.com/w/cpp/string/basic_string)を使用し、文字列には' 'std :: vector''(http: //en.cppreference.com/w/cpp/container/vector)を動的 "配列"に変換します。 –

+4

ああ、おそらく、あなたが表示するコードにバグがあります。割り当てに '' \ 0 ''文字の終わりのためのスペースが含まれていないからです。 –

答えて

1

それはあなたのコード内plantValueのように見えますが、生のCスタイルの文字列へのポインタの配列へのポインタである、すなわち上に示されたchar*ベクトル内のスロットにそれへのポインタを格納するステップとを含む。

特に、plantCount-1は、あらかじめ割り当てられたポインタ配列の最初の使用可能なスロットのインデックスです。 plantValue + (plantCount-1)がそのスロットを指し、*(plantValue + (plantCount-1)) = ...を指定すると、そのスロットにmalloc()が返す文字列ポインタが書き込まれます。

上記のコードはC++よりもCであることに注意してください。たとえば、C++では、明示的な動的メモリ割り当てにmalloc()の代わりにnew[]を使用します。 C++では標準のコンテナクラスが好きで、char*所有ポインタの代わりにstd::vectorstd::stringが必要です。これらのC++クラスは自動的に独自のメモリを管理し、コードを大幅に簡素化します。

P.S. Cスタイルの文字列はNUL終端されているので、malloc()の新しい文字列にメモリを割り当てるときは、の合計をと計算すると終端NULも考慮する必要があります。つまり、SAPPlantStr.length() + 1あなたのコード)。

+0

ありがとうございます。私は疑いを明確にした。 –

+0

あなたは大歓迎です。喜んで助けになる。 –

0

plantValue [plantCount-1]は、任意のポインタまたは配列 `p`インデックス` i`についてSAPPlantStr

+0

それは彼がそれを書いていたはずです。ポインタ逆参照構文が混乱しています。 –

関連する問題