创建没有C库的动态数组并调整其大小?

时间:2013-02-06 17:51:35

标签: c arrays dynamic malloc

有没有办法在C中实际创建动态数组而不必使用stdlib?

Malloc需要stdlib.h库,我不允许在我的项目中使用它。

如果有任何想法,请分享?感谢。

2 个答案:

答案 0 :(得分: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*占用了多少块。 第三,搜索空闲内存的方式(线性)非常慢,通常块会创建一个空闲块的链接列表。

但是,就像我说的,这是一个很好的快速入门。根据您的需要,这可能会很好地实现。

1 如果没有,那么你绝对没有理由不使用malloc。

答案 1 :(得分: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;
}
像老板一样! : - )