3

stdlibを使用せずにCで動的配列を実際に作成する方法はありますか?

Mallocstdlib.hライブラリが必要です。プロジェクトでこれを使用することは許可されていません。

誰かアイデアがあれば教えてください。ありがとう。

4

2 に答える 2

8

malloc単なるライブラリではなく、実行中のプロセスに追加のメモリを要求するためにオペレーティング システムとやり取りする方法です。より多くのメモリを要求し、空きメモリと占有メモリを自分で管理することもできますが、それは多くのレベルで間違っています。

しかし、あなたのプロジェクトは、オペレーティング システムを持たない何らかのプラットフォームで実行されると思いがちですよね? 1その場合、より迅速な解決策は、最初に大きなグローバル配列に静的にメモリを割り当てることです。メモリが必要になるたびに、この大きな配列を担当するマネージャーに依頼します。

例を挙げましょう。簡単にするために、小さくてあまり機能的ではありませんが、非常に良いクイックスタートです。

typedef char bool;

#define BLOCK_SIZE 1024 //Each allocation must have in max 1kb
#define MAX_DATA 1024*1024*10  //Our program statically allocates 10MB
#define BLOCKS (MAX_DATA/BLOCK_SIZE)

typedef char Scott_Block[BLOCK_SIZE];

Scott_Block Scott_memory[BLOCKS];
bool Scott_used_memory[BLOCKS];

void* Scott_malloc(unsigned size) {
    if( size > BLOCK_SIZE )
        return NULL;
    unsigned int i;
    for(i=0;i<BLOCKS;++i) {
        if( Scott_used_memory[i] == 0 ) {
            Scott_used_memory[i] = 1;
            return Scott_memory[i];
        }
    }
    return NULL;
}

void Scott_free(void* ptr) {
    unsigned int pos = ((char*)(ptr)-Scott_memory[0])/BLOCK_SIZE;
    printf("Pos %d\n",pos);
    Scott_used_memory[pos] = 0;
}

このコードは、メモリ マネージャーをエミュレートする方法を示すために作成しました。それに対して行われる可能性のあるいくつかの改善点を指摘させてください。

まず、Scott_used_memory を配列ではなくビットマップにすることができますbool。次に、BLOCK_SIZE よりも大きなメモリを割り当てません。連続するブロックを検索して、より大きなブロックを作成する必要があります。しかし、そのためには、割り当てられたブロックがどれだけvoid*占有しているかを知るために、より多くの制御データが必要になります。第 3 に、空きメモリを (直線的に) 検索する方法が非常に遅く、通常、ブロックは空きブロックのリンク リストを作成します。

しかし、私が言ったように、これは素早いスタートです。そして、あなたのニーズに応じて、これはそれを非常にうまく満たすかもしれません.

1そうでない場合は、malloc を使用しない理由はまったくありません。

于 2013-02-06T18:16:32.973 に答える
2

では、このプログラム (C99) ではないでしょうか。

#include <stdio.h>

int main(int argc, char *argv[])
{
   int sizet, i;
   printf("Enter size:");
   scanf("%d",&sizet);
   int array[sizet];
   for(i = 0; i < sizet; i++){ 
     array[i] = i;
   }
   for(i = 0; i < sizet; i++){
     printf("%d", array[i]);
   }
   return 0;
}

偉ぶって!:-)

于 2013-02-06T18:29:51.477 に答える