c - 没有操作系统的运行时内存分配

标签 c memory memory-management

最近我一直在思考编译期内存分配是如何完成的。据我所知,编译器在编译时为变量分配固定数量的字节。对于这样的声明是有意义的:

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/

相关文章:

c - 进程线程被 __pthread_enable_asynccancel () 卡住

MYSQL内存使用

java - 当未指定索引之一时,多维数组如何分配内存

python - 在 Ubuntu 12.04 上设置 python 内存限制

iphone - 关于临时对象的 iOS 内存/性能优化

java - 高效使用 NUMA 架构

c++ - 结构体中的数组在删除时会被释放吗?

c - OpenGL MVP 矩阵计算错误

c - 在函数中交换字符指针

c - 嵌入式C测试开发管理