有没有办法在 C 中实际创建动态数组而不必使用标准库?
Malloc
需要stdlib.h
库,我不允许在我的项目中使用它。
如果有人有任何想法,请分享?谢谢。
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。
那么为什么不这个程序(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;
}
如同一位老板!:-)