複数行のテキストを表現する方法について、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で入手できます。