1

Python での次の単純なプログラムについて考えてみましょう。

n=int(input("enter your lower limit"))
m=int(input("enter your higher limit"))
list=[]
x=n
while x<=m:
    if (x%2==0):
        list.append(x)
    x+=1
print("the even numbers in your range are:",end="")
print(len(list))

ここでは、最初に list の要素を何も宣言せずに結果を挿入し続けることができます。その範囲は完全にユーザーに依存します。次に、そのリストの長さを確認できるため、ユーザーの範囲内で条件を満たした要素の数を確認できます。したがって、Python では簡単になります。

しかし C では、最初に配列の要素数を宣言する必要があります。それをランダムな大きな数に宣言してから、結果を挿入し続けることができます。そして、キャラクターの前にいくつの要素があるかを確認することで、最終的な結果 (ユーザーの範囲内で条件を満たした要素の数) を見つけます\0。しかし、それでも大量のメモリを浪費し、未使用の要素にガベージを保持するため、大規模なプログラムでは問題が発生する可能性があります!

良い!について少し知っていmalloc()ます。しかし、ここでもサイズを宣言する必要があります。後でメモリを解放して、より大きなプログラムの負担を軽減することはできますが、C に Python のような簡単なプロセスが存在するかどうかを本当に知りたいですか?

4

5 に答える 5

7

動的に割り当てられた配列などの動的データ セットが必要です。mallocまたはを使用callocして、初期配列を作成し、reallocそのサイズを変更できます。ただし、成功するかどうかをテストするように注意してください。

Foo * array = calloc(25, sizeof(Foo));         // space for 25 Foo's, zeroed out
// test for "array != NULL"                    // "25" can be a dynamic value

// use array[0], array[1], ..., array[24]


Foo * tmp = realloc(array, 250 * sizeof(Foo)); // extend to 250 elements
if (tmp) { array = tmp; }
else     { /* error! */ }

// use ... array[249]


free(array);                                   // clean up

または、リンクされたリストやツリーなどの他の動的データ構造を実装し、各要素 (各ノード) のスペースを個別に割り当て/解放し、何らかの形でそれらを追跡することができます。連続配列は、最も単純で単純な動的データ構造にすぎませんが、多くのシナリオに適しています。

于 2012-07-15T14:54:54.040 に答える
3

を使用するLinked Listか、配列のサイズを変更して、動的に拡大できるようにすることができます。基本的な考え方:

#include<stdlib.h>
#include<stdio.h>

struct list_el {
   int val;
   struct list_el * next;
};

typedef struct list_el item;

void main() {
   item * curr, * head;
   int i;

   head = NULL;

   for(i=1;i<=10;i++) {
      curr = (item *)malloc(sizeof(item));
      curr->val = i;
      curr->next  = head;
      head = curr;
   }

   curr = head;
   item * temp;
   while(curr) {
      temp = curr->next;
      printf("%d\n", curr->val);
      free(curr);
      curr = temp;
   }
}

配列を使用する場合は、reallocを使用します。

于 2012-07-15T14:55:37.110 に答える
2

これがCの仕組みです。メモリの消費、割り当て、割り当て解除などを手動で制御する必要があります。

あなたの場合、次のことができます:

  1. 再割り当てを使用します。配列を再割り当てし、メモリを追加して内容をコピーします。
  2. http://bstring.sourceforge.net/などの外部ライブラリを使用して 、動的文字列/配列などの複雑さを隠します
  3. 独自のプールを管理するメモリ管理ライブラリを使用すると、アプリケーションのメモリ消費量 (システムから見える) は一定になりますが、アプリ内では変数と配列を柔軟に管理できます。
  4. C++ に切り替えて、STL コンテナーを使用します。
于 2012-07-15T14:56:42.603 に答える
1

realloc を使用して、以前に malloc で割り当てた「配列」(メモリのブロック) を動的に拡張できます。配列の古い内容は保持されます。

http://en.cppreference.com/w/c/memory/reallocを参照してください。

于 2012-07-15T14:49:29.067 に答える
0

基本的に、ターゲットアイテムを指すポインターの配列のみを格納する動的配列について確認してみてください。配列を拡張するたびに、実際にはこのポインター配列を再割り当てし、ポインターを更新するだけです。

于 2012-07-15T14:58:01.197 に答える