2012-04-06 11 views
0

私は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が一般に好ましいと修正していますか?

+1

注: 'strncpy()'の使い方は間違っていますが、リテラルの例では大丈夫です。 'strncpy()'を安全に使うためには、コピー先の配列のサイズより1小さいものをコピーし、最後の要素を '\ 0'で埋めなければなりません。それ以外の場合は、文字列ではないchar配列を持つリスクがあります。 – pmg

+1

変数のタイプが間違っているため、メソッドAのコードでストレージが正しく使用されていません。 'char(* array_person_name)[100];'と 'char(* array_param)[2];'となります。 – Neil

答えて

1

あなたはかなり遠いです。 1:はい、2:いいえ、3:いいえ、4:はい。私はそれをすべてやるつもりはありませんが、ここにはいくつかのヒントがあります。

文字列を格納するスペースと文字列へのポインタを格納するスペースが必要です(後者はメソッドAでは厳密には必要ありません)。最初のタイプはchar*、次のタイプはchar**となります。

メソッドAでは、文字列ストレージを正しく割り当てていますが、文字列ポインタの記憶域を正しく割り当てる必要があります(ヒント:char*ポインターのarraysizeインスタンスが必要です)。その後、100文字ずつ異なるポインタに初期化されます。

方法Bの場合、必要なスペースがわからないので、文字列を格納するためのスペースを割り当てる簡単な方法はありません。長さを数えるために一度だけすべての文字列を繰り返したり、文字列ごとにmallocを1つ実行したり、固定サイズのチャンクを使用して、使い果たしたときにさらに割り当てることができます。

メソッドBは、メソッドAと同じ文字列ストレージポインタ配列を使用します。文字列ポインタは、それらがどこに行くのかを知ったら配列に割り当てる必要があります。

+0

おかげさまでキース氏は 'メソッドAに関して、文字列の記憶域を正しく割り当てていますが、文字列ポインタの記憶域を正しく割り当てる必要があります(ヒント:char *ポインタの配列インスタンスが必要です)。その後、100文字ずつ異なるポインタに初期化されます。次に方法Aと同じ記憶空間を使用する方法B(例えば両方の長方形アレイ)ではないか? – ggkmath

+0

彼らは*文字列ポインタ*のために同じ記憶域を使用しますが、*文字列自体のためには同じ記憶域を使用しません。言い換えれば、文字列ポインタの格納用に文字列ごとに4バイト(または64ビットを実行している場合は8バイト)を使用します。メソッドAは文字列ごとに100バイトを追加使用しますが、メソッドBはすべての文字列の合計長(文字列終端文字の文字列ごとに1バイト)だけを使用します。 –