0

C プログラムでより効率的なコードを書こうとしていますが、ポインターと代入を正しくするための助けが必要です。以下に 2 つのメソッドを示しました。それぞれ次の宣言と strncpy を使用しています。

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";
}

作成しようとしている配列は、配列の各要素に同じ値を配置していることに注意してください。メソッド A は要素の (四角形の) 配列でありarraysize、各要素自体は 100 文字の配列です。arraysize方法 Bは、各要素が char へのポインターである要素 の (不規則な) 配列を作成することによって、ストレージ スペースを無駄にしないようにします。

質問 1: 方法 A でメモリ (malloc など) を正しく割り当てていますか?

質問 2: 方法 B の構文は正しいですか?

質問 3: メソッド B で配列にメモリを割り当てるにはどうすればよいですか?

質問 4: 方法 B が一般的に好まれるというのは正しいですか?

4

1 に答える 1

1

あなたはここからかなり離れています。1:はい、2:いいえ、3:いいえ、4:はい。すべてを行うわけではありませんが、ヒントをいくつか紹介します。

文字列を格納するためのスペースと、文字列へのポインターを格納するためのスペースが必要です (方法 A では、後者は厳密には必要ありません)。1 つ目は type char*、2 つ目は type を持ちchar**ます。

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

方法 B の場合、文字列を格納するためのスペースを簡単に割り当てる方法はありません。どのくらいのスペースが必要になるかわからないからです。長さをカウントするためだけにすべての文字列を 1 回反復するか、malloc文字列ごとに 1 回反復するか、固定サイズのチャンクを使用して不足したときにさらに割り当てることができます。

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

于 2012-04-06T21:15:38.000 に答える