最近我一直在思考编译期内存分配是如何完成的。据我所知,编译器在编译时为变量分配固定数量的字节。对于这样的声明是有意义的:
char buffer[256];
编译器会为该变量分配 256 字节的内存,然后就结束了。如果我想动态创建内存,我需要使用操作系统提供的诸如 malloc 之类的函数。然后我想到了这个函数,它不会使用任何操作系统相关的功能,但它会像动态分配一样。
*char malloc(size_t size) {
char (*mem)[size];
return mem;
}
编译器无法预先分配内存,因为在程序运行时可以多次调用该函数。这究竟是如何运作的?编译器将如何处理这样的函数?我假设操作系统可以处理这个问题,但这不使用任何依赖于操作系统的功能,这意味着它可以在没有操作系统的硬件上运行。
最佳答案
首先,*char
应该是 char*
并且 mem
不应该是指针::
char* malloc(size_t size) {
char mem[size];
return mem;
}
这会分配 size
字节的内存作为堆栈上的局部变量。如您所知,局部变量在函数退出时被销毁。它返回一个指向局部变量的指针,然后由于函数退出,局部变量被销毁。实际上,该空间将被重用于下一个函数调用的局部变量。
如果您尝试以这种方式分配两个内存块,您很可能会获得相同的地址:
char *mem1 = malloc(10); // using your malloc
char *mem2 = malloc(10); // using your malloc
// probably mem1 and mem2 point to the same memory now
如果您调用另一个函数,内存可能会被损坏,因为该函数也允许使用局部变量:
char *mem1 = malloc(10); // using your malloc
strcpy(mem1, "abcde"); // if you're lucky, strcpy won't crash...
printf("Hello world.\n");
printf("mem1 contains %s\n"); // it won't be abcde because strcpy or printf overwrote the memory
简而言之:
How exactly would this work?
不会的。
关于c - 没有操作系统的运行时内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55486545/