0

可変長配列を取る必要がある ac 関数を設計する場合、次のいずれかを選択するにはどうすればよいですか?

  1. 配列の長さを与えるために別のパラメータを追加しますか? と
  2. 特殊なマーカー (「\0」など) で配列を終了しますか?
  3. 他のオプション?何?

例えば

void myfunc(int arr[], int arr_length) { ... }
...
int arr[3] = { 1, 2, 3 };
myfunc(myarr, 3);

また

void myfunc(int arr[]) { ... }
...
int arr[4] = { 1, 2, 3, '\0' };
myfunc(arr);
4

2 に答える 2

1

規則では、配列が文字配列 (つまり、文字列) でない限り、配列の長さを渡します。その場合、C は文字列を 0x00 で自動的に null で終了します。

選択した null ターミネータを使用して、配列を終了できます。たとえば、signed int の配列があり、いずれも負にならないことがどういうわけかわかっている場合は、-1 (または任意の負の数) を使用できます。null ターミネータを使用する際の問題は、いくつかの可能な値が失われることです。たとえば、4 ビット長のデータ型を考えてみましょう。ターミネータとして 0b1111 を定義すると、この型の配列に入れることができる最大値は 0b1110 になります。文字列が null で終了する理由は、ASCII では、表現したい文字よりも 0 から 255 までの数字の方が多いため、null ターミネータを使用してもコストはかからないからです。

配列の長さを渡し、配列内のすべての値をループしている場合、for ループで使用する最大値が自動的に取得されます。その上、C では、ほとんどの場合、配列を作成するときに配列の長さを知っています。

編集:そして、配列の終了マーカーを渡す限り、コンピューターで実行するプログラムにとっては問題にならないはずですが、ハードウェアの実装が異なるとデータ型のサイズが異なるため、再考します。コンピューターに 4 つの整数 (16 ビット) の配列がある場合、0x1000 で始まる配列は、コンピューターでは (たとえば) 0x1008 で終了しますが、私の場合は 0x1004 で終了します。

于 2013-05-27T17:29:52.553 に答える
0

int arr_lengthグローバル変数として宣言します。その場合は渡す必要はありません。

または

長さを引数として渡します。ただし、終了マーカーとして特殊文字を使用しないでください。'\0'のように渡すとint arr[4] = { 1, 2, 3, '\0' };。次に、 ( 0arr[3] )に相当する ASCII を格納します。これは、正当な入力の一部である可能性が非常に高くなります。'\0'

于 2013-05-27T17:24:07.937 に答える