Cが初めてです、助けてくれてありがとう。
サイズを指定したり初期化したりせずに、Cで配列を定義することは可能ですか?
たとえば、数値を入力して int 配列に格納するようにユーザーに促すことはできますか? 事前に何桁入るかわかりません。
私が今考えることができる唯一の方法は、理想的な解決策ではない最大サイズを定義することです...
Cが初めてです、助けてくれてありがとう。
サイズを指定したり初期化したりせずに、Cで配列を定義することは可能ですか?
たとえば、数値を入力して int 配列に格納するようにユーザーに促すことはできますか? 事前に何桁入るかわかりません。
私が今考えることができる唯一の方法は、理想的な解決策ではない最大サイズを定義することです...
サイズを動的に割り当てることができます。
#include <stdio.h>
int main(int argc, char *argv[])
{
int *array;
int cnt;
int i;
/* In the real world, you should do a lot more error checking than this */
printf("enter the amount\n");
scanf("%d", &cnt);
array = malloc(cnt * sizeof(int));
/* do stuff with it */
for(i=0; i < cnt; i++)
array[i] = 10*i;
for(i=0; i < cnt; i++)
printf("array[%d] = %d\n", i, array[i]);
free(array);
return 0;
}
おそらくこのようなもの:
#include <stdio.h>
#include <stdlib.h>
/* An arbitrary starting size.
Should be close to what you expect to use, but not really that important */
#define INIT_ARRAY_SIZE 8
int array_size = INIT_ARRAY_SIZE;
int array_index = 0;
array = malloc(array_size * sizeof(int));
void array_push(int value) {
array[array_index] = value;
array_index++;
if(array_index >= array_size) {
array_size *= 2;
array = realloc(array, array_size * sizeof(int));
}
}
int main(int argc, char *argv[]) {
int shouldBreak = 0;
int val;
while (!shouldBreak) {
scanf("%d", &val);
shouldBreak = (val == 0);
array_push(val);
}
}
これにより、番号の入力を求められ、要求どおりに配列に格納されます。0を指定して渡されると終了します。
array_push
配列に追加するためのアクセサー関数を作成し、realloc
スペースが不足したときにこの関数を使用して呼び出します。毎回割り当てられるスペースの量を2倍にします。せいぜい必要なメモリの2倍を割り当て、最悪の場合はrealloc
logをn回呼び出します。ここで、nは最終的に意図された配列サイズです。
また、mallocおよびreallocを呼び出した後、失敗をチェックすることもできます。私は上記でこれをしていません。
定義上、配列は固定サイズのメモリ構造です。ベクトルが必要です。標準 C ではベクトルが定義されていないため、ライブラリを探すか、独自のものを手動で作成してみてください。
動的割り当てを行う必要があります。まだ未知のサイズのメモリアドレスへのポインタが必要です。とを読んでmalloc
くださいrealloc
。
そのとおり。C99 では、VLA または可変長配列が導入されました。いくつかの単純なコードは次のようになります。
#include <stdio.h>
int main (void) {
int arraysize;
printf("How bid do you want your array to be?\n");
scanf("%d",&arraysize);
int ar[arraysize];
return 0;
}
サイズを動的に変更できるデータ構造だけが必要な場合は、リンクリストが最適です。リストにデータを動的に追加してメモリを割り当てることができ、これははるかに簡単です!!
あなたが初心者ならmalloc
、free
まだ対処したくないかもしれません。したがって、GCC を使用している場合は、サイズを式として指定するだけで、可変サイズの配列をスタックに割り当てることができます。
例えば:
#include <stdio.h>
void dyn_array(const unsigned int n) {
int array[n];
int i;
for(i=0; i<n;i++) {
array[i]=i*i;
}
for(i=0; i<n;i++) {
printf("%d\n",array[i]);
}
}
int main(int argc, char **argv) {
dyn_array(argc);
return 0;
}
ただし、これは非標準の拡張機能であるため、移植性が重要な場合は当てにしないでください。
このような場合、次のようなデータ構造を調べることができます: リンク リスト (この状況に最適) さまざまなツリー (バイナリ ツリー、ヒープなど) スタックとキュー
しかし、可変サイズの配列のインスタンス化に関しては、これは実際には不可能です。
動的配列に最も近いのは、malloc とそれに関連するコマンド (delete、realloc など) を使用することです。
しかし、この状況では、malloc のようなコマンドを使用すると、配列を拡張する必要が生じる可能性があります。これは、別の配列を初期化してから古い配列をそこにコピーするという高価な操作です。リストやその他のデータ型は、通常、サイズ変更に優れています。
を使用malloc
してメモリを動的に割り当てることができます (つまり、サイズは実行時までわかりません)。
C は低水準言語です。使用後にメモリを手動で解放する必要があります。そうしないと、プログラムでメモリ リークが発生します。
別の回答に関するコメントを読んでください。
動的に変化するサイズの配列を求めています。
C にはそれを行うための言語/構文機能がありません。これを自分で実装するか、すでに実装されているライブラリを使用する必要があります。
この質問を参照してください: glibc に付属する C 用の自動サイズ変更配列/動的配列実装はありますか?