8

Cが初めてです、助けてくれてありがとう。

サイズを指定したり初期化したりせずに、Cで配列を定義することは可能ですか?

たとえば、数値を入力して int 配列に格納するようにユーザーに促すことはできますか? 事前に何桁入るかわかりません。

私が今考えることができる唯一の方法は、理想的な解決策ではない最大サイズを定義することです...

4

10 に答える 10

15

サイズを動的に割り当てることができます。

#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;
}
于 2009-10-20T01:24:22.863 に答える
6

おそらくこのようなもの:

#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倍を割り当て、最悪の場合はrealloclogをn回呼び出します。ここで、nは最終的に意図された配列サイズです。

また、mallocおよびreallocを呼び出した後、失敗をチェックすることもできます。私は上記でこれをしていません。

于 2009-10-20T01:58:43.793 に答える
3

定義上、配列は固定サイズのメモリ構造です。ベクトルが必要です。標準 C ではベクトルが定義されていないため、ライブラリを探すか、独自のものを手動で作成してみてください。

動的割り当てを行う必要があります。まだ未知のサイズのメモリアドレスへのポインタが必要です。とを読んでmallocくださいrealloc

于 2009-10-20T01:25:23.250 に答える
3

そのとおり。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;
}
于 2012-02-15T20:20:11.263 に答える
2

サイズを動的に変更できるデータ構造だけが必要な場合は、リンクリストが最適です。リストにデータを動的に追加してメモリを割り当てることができ、これははるかに簡単です!!

于 2009-10-20T05:01:50.613 に答える
1

あなたが初心者ならmallocfreeまだ対処したくないかもしれません。したがって、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;
}

ただし、これは非標準の拡張機能であるため、移植性が重要な場合は当てにしないでください。

于 2009-12-10T19:00:52.140 に答える
0

このような場合、次のようなデータ構造を調べることができます: リンク リスト (この状況に最適) さまざまなツリー (バイナリ ツリー、ヒープなど) スタックとキュー

しかし、可変サイズの配列のインスタンス化に関しては、これは実際には不可能です。

動的配列に最も近いのは、malloc とそれに関連するコマンド (delete、realloc など) を使用することです。

しかし、この状況では、malloc のようなコマンドを使用すると、配列を拡張する必要が生じる可能性があります。これは、別の配列を初期化してから古い配列をそこにコピーするという高価な操作です。リストやその他のデータ型は、通常、サイズ変更に優れています。

于 2009-10-20T02:34:39.647 に答える
0

配列機能を探していて、自分で作成したくない場合は、次のことを試してください。

  1. ギブ
  2. アパッチ APR
  3. NSPR
于 2009-10-20T02:35:32.250 に答える
0

を使用mallocしてメモリを動的に割り当てることができます (つまり、サイズは実行時までわかりません)。

C は低水準言語です。使用後にメモリを手動で解放する必要があります。そうしないと、プログラムでメモリ リークが発生します。

アップデート

別の回答に関するコメントを読んでください。

動的に変化するサイズの配列を求めています。

C にはそれを行うための言語/構文機能がありません。これを自分で実装するか、すでに実装されているライブラリを使用する必要があります。

この質問を参照してください: glibc に付属する C 用の自動サイズ変更配列/動的配列実装はありますか?

于 2009-10-20T02:04:27.340 に答える