2

複数行のテキストを表現する方法について、C で小さなプログラミング実験を行っています。

配列の配列、ポインターの配列、配列のポインター、およびポインターのポインターの 4 つの方法を考え出しました。

配列のポインターで少し問題が発生しました。配列を作成するたびに、実際には、既に作成した配列を再利用するだけです。

プログラムの「配列のポインター」(pa) 部分の出力をチェックして、私が何を意味するかを確認してください。

variable    address         value
==========  ==============  =====
pa          0x10f500970

*(pa+0)     0x7fff6f0334bd

*(pa+0)[0]  0x7fff6f0334bd  t
*(pa+0)[1]  0x7fff6f0334be  e
*(pa+0)[2]  0x7fff6f0334bf  s
*(pa+0)[3]  0x7fff6f0334c0  t
*(pa+0)[4]  0x7fff6f0334c1
*(pa+0)[5]  0x7fff6f0334c2  0

*(pa+1)     0x7fff6f0334bd

*(pa+1)[0]  0x7fff6f0334bd  t
*(pa+1)[1]  0x7fff6f0334be  e
*(pa+1)[2]  0x7fff6f0334bf  s
*(pa+1)[3]  0x7fff6f0334c0  t
*(pa+1)[4]  0x7fff6f0334c1
*(pa+1)[5]  0x7fff6f0334c2  1

各配列のアドレスが同じであることがわかりますか? かっこよくないですか?

ここに私の質問があります:既存の配列の内容を書き換えるのではなく、> 1 ループで実際に新しい配列を宣言する方法はありますか?

スニペットは次のとおりです: (LIST_SIZE = 2 and TEXT_SIZE = 6)

void** pa = malloc(LIST_SIZE * sizeof(void*));

printh();

printf("pa\t\t%p\n\n", pa);

for(int i = 0; i < LIST_SIZE; i++)
{
  char txt[TEXT_SIZE + 1];

  sprintf(txt, "test %d", i);

  *(pa + i) = txt;

  printf("*(pa+%d)\t\t%p\n\n", i, *(pa + i));

  for(int j = 0; j < TEXT_SIZE; j++){
    printf("*(pa+%d)[%d]\t%p\t%c\n", i, j, &(((char*)*(pa+i))[j]), ((char*)*(pa+i))[j]);
  }

  printf("\n");
}

ありがとう。他にもご意見やご提案がありましたら、ぜひお聞きしたいと思います。

完全なソース コードはhttps://gist.github.com/80m/7143558で入手できます。

4

2 に答える 2

1

変数txtforループに対してローカルです。反復ごとに、古いtxt変数は無効になり、別のtxtインスタンスが作成されます。これはtxt、前の反復で割り当てられたポインターが、次の反復の開始時に有効なオブジェクトを指していないことを意味します。

ループが終了すると、どのポインタも有効なものを指していません。

これを修正する 1 つの方法は、割り当て先のポインターごとに動的にメモリを割り当てることです。

    pa[i] = malloc(TEXT_SIZE+1);
    snprintf(pa[i], TEXT_SIZE+1, "test %d", i);

「配列へのポインター」が必要だと言いますが、ポインターへのポインターvoid **paを作成する of を宣言しました。配列へのポインターがpa必要な場合は、次のように宣言します。pa

char (*pa)[TEXT_SIZE+1] = malloc(LIST_SIZE * sizeof(*pa));

したがって、pa[0]1 つの 7 バイト配列にpa[1]なり、2 つ目の 7 バイト配列になります。ループ内で動的割り当てを行う必要がなくなります。

于 2013-10-24T19:48:23.580 に答える