如果你编写了一个没有指针的C程序那么这是否意味着程序可以消耗多少内存?如果没有,那么在给定代码中变量的数量/类型的情况下,除了可能消耗更多内存之外,还有哪些其他方式?
此外,指针本身使用了多少内存?
- 编辑 -
我看到这在答案中出现了很多
如果不使用动态分配,则限制为堆栈大小
这是否意味着如果你有动态分配,系统/编译器会随着你的进度增加/减少你的堆栈?
--EDIT#2
当我说"绝对限制多少内存......"时,显然带有指针的程序无法获得无限的内存(但这会有多甜?),但我的意思是,程序可以消耗多少内存可以量化为有限数,或者还有其他方式让内存继续增长,超出仅为变量分配的数量.
@djechlin和@wallyk指出递归可能导致内存动态增加.
显然,似乎可以创建一个内存使用受其架构限制的程序,但它必须是一个相当简单的程序来实现这一点.
感谢所有伟大的答案和热情!
如果编写程序时没有动态分配任何内存(完全可行且非常常见),但您将受限于编译器和/或环境分配给程序的堆栈大小.
如果你想通过堆栈使用比你可用更多的内存并且不想使用动态内存(参见精神错乱),你可以将变量等存储在一个临时文件中并对其进行写入/读取,就好像它是一个缓冲区一样.记忆.唯一的问题是,如果你真的不想使用指针,你实际上无法打开文件!(在跨平台,遵循标准;良好程序员的方式)C标准库函数fopen
返回一个FILE*
用于文件操作函数.
哦,回答你关于指针有多大的问题:
这取决于.
在大多数通用操作系统上,32位系统将具有32位指针(4个字节),而64位系统将具有64位指针(8个字节)
您可以通过编写一个小测试程序来了解它们在您的系统中有多大:
#include <stdio.h>
int main(int argc, char *argv[]){
printf("%zu\n", sizeof(void*));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
- 编辑 -
动态内存管理使用称为"堆"的堆栈空间以外的东西.堆可以动态分配到任何必要的大小(受系统参数限制),但是必须使用malloc
/的调用对显式地释放堆上分配的所有内存,free
因此程序员对动态内存管理负有更多责任,但也更有可能拧紧与访问释放的内存和悬空指针等事情.
这是新C程序员最关注的事情.(通常非简单malloc
的像动态3D数组等)