私はCプログラムでより効率的なコードを書こうとしています。私はポインタと割り当てを正しくする助けが必要です。Cプログラム:不規則な文字列配列
int kk, arraysize;
char person_name[100] = "";
char * array_person_name, * array_param;
...
strncpy(person_name, "John Smith", 100);
arraysize = <this value is downloaded from database>;
...
方法A(矩形アレイ):
array_person_name = malloc(sizeof(char) * arraysize *100);
array_param = malloc(sizeof(char) * arraysize * 2);
for (kk = 0; kk < arraysize; kk++) {
strncpy(array_person_name[kk], person_name, 100);
strncpy(array_param[kk], "bt", 2);
}
方法B(不揃いアレイ):
for (kk = 0; kk < arraysize; kk++) {
array_person_name[kk] = &person_name;
array_param[kk] = "bt";
}
Iは、それぞれが次の宣言とstrncpyをを使用して、2つの方法を以下に示してきました
作成しようとしている配列は配列の各要素に同じ値を配置していることに注意してください。方法Aはarraysize
要素の(長方形の)配列であり、各要素自体は100文字の配列です。方法Bは、arraysize
要素の(不揃いな)配列を作成することによって記憶スペースを無駄にしないようにしようとします。各要素は、ポインタへのポインタです。
質問1:方法Aで正しくメモリ(たとえばmalloc)を割り当てていますか?
質問2:構文Bが正しいと思われますか?
質問3:メソッドBの配列にどのようにメモリを割り当てるのですか?
質問4:方法Bが一般に好ましいと修正していますか?
注: 'strncpy()'の使い方は間違っていますが、リテラルの例では大丈夫です。 'strncpy()'を安全に使うためには、コピー先の配列のサイズより1小さいものをコピーし、最後の要素を '\ 0'で埋めなければなりません。それ以外の場合は、文字列ではないchar配列を持つリスクがあります。 – pmg
変数のタイプが間違っているため、メソッドAのコードでストレージが正しく使用されていません。 'char(* array_person_name)[100];'と 'char(* array_param)[2];'となります。 – Neil