19

ダブルポインターにメモリを割り当てる方法がわかりません。文字列の配列を読み取って保存したい。

    char **ptr;
    fp = fopen("file.txt","r");
    ptr = (char**)malloc(sizeof(char*)*50);
    for(int i=0; i<20; i++)
    {
       ptr[i] = (char*)malloc(sizeof(char)*50);
       fgets(ptr[i],50,fp);
    }

これの代わりに、大きなメモリブロックを割り当てて文字列を保存するだけです

  char **ptr;
  ptr = (char**)malloc(sizeof(char)*50*50);

それは間違っているでしょうか?もしそうなら、それはなぜですか?

4

7 に答える 7

16

2 番目の例は間違っています。なぜなら、各メモリ位置は概念的には保持されずchar*、むしろchar. 考え方を少し変えると、次のことに役立ちます。

char *x;  // Memory locations pointed to by x contain 'char'
char **y; // Memory locations pointed to by y contain 'char*'

x = (char*)malloc(sizeof(char) * 100);   // 100 'char'
y = (char**)malloc(sizeof(char*) * 100); // 100 'char*'

// below is incorrect:
y = (char**)malloc(sizeof(char) * 50 * 50);
// 2500 'char' not 50 'char*' pointing to 50 'char'

そのため、最初のループは、C で文字配列/ポインターの配列を行う方法になります。文字配列の配列にメモリの固定ブロックを使用することは問題ありませんが、メモリにはポインターがなく、 s だけであるため、char*ではなく単一を使用します。char**char

char *x = calloc(50 * 50, sizeof(char));

for (ii = 0; ii < 50; ++ii) {
    // Note that each string is just an OFFSET into the memory block
    // You must be sensitive to this when using these 'strings'
    char *str = &x[ii * 50];
}
于 2010-02-13T14:00:50.187 に答える
2

ダブルポインターは、別のポインターへの単なるポインターです。したがって、次のように割り当てることができます。

char *realptr=(char*)malloc(1234);
char **ptr=&realptr;

ポインターがどこに格納されているかを覚えておく必要があります (この例では、二重ポインターはスタック上のポインター変数を指しているため、関数が戻った後は無効になります)。

于 2010-02-13T13:50:52.227 に答える
-5

ダブルポインターは、簡単に言えば、ポインターへのポインターです。多くの場合、他の型の配列として使用されます。

たとえば、文字列の配列を作成する場合は、次のように簡単に実行できます。

char** stringArray = calloc(10, 40);

これにより、サイズ 10 の配列が作成され、各要素は長さ 40 の文字列になります。

したがって、stringArray[5] でこれにアクセスし、6 番目の位置で文字列を取得できます。

これは 1 つの使用法であり、他の使用法は上記のとおり、ポインターへのポインターであり、次の方法で簡単に割り当てることができます。

char* str = (char*)malloc(40);
char** pointerToPointer = &str //Get the address of the str pointer, valid only in the current closure.

ここでもっと読む: 良い配列のチュートリアル

于 2010-02-13T14:00:36.613 に答える