c - 如果你写了一个没有指针的 C 程序

标签 c pointers

如果您编写了一个没有指针的 C 程序,那么这是否意味着该程序可以消耗多少内存存在绝对限制?如果不是,那么在给定代码中变量的数量/类型的情况下,还有哪些其他方式可以消耗比可能消耗更多的内存?

另外,指针本身占用多少内存?

--编辑--

我看到这在答案中出现了很多

You are limited to stack size if you don't use dynamic allocation

这是否意味着如果你有动态分配,系统/编译器会随着你的进行增加/减少你的堆栈?

--编辑#2

当我说“内存量的绝对限制...”时,显然带有指针的程序不会获得无限内存(但那该有多好?),但我的意思是,内存量程序可以消耗可量化的有限数量,或者是否有其他方法可以让内存继续增长,而不仅仅是分配给变量的数量。

@djechlin 和@wallyk 指出递归可能导致内存动态增加。

显然,创建一个内存使用受其架构限制的程序似乎是可能的,但它必须是一个相当简单的程序才能实现这一点。

感谢所有出色的回答和热情!

最佳答案

如果您编写的程序没有动态分配任何内存(完全可行且非常常见),但您的编译器和/或环境将限制分配给您的程序的堆栈大小。

如果你想使用比堆栈可用的内存更多的内存并且不想使用动态内存(参见insanity)你可以将变量等存储在一个临时文件中并写/读取它就好像它是内存中的缓冲区一样。唯一的问题是,如果您真的不想使用指针,您实际上无法打开文件! (以跨平台、遵守标准、优秀程序员的方式)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;
}

--编辑--

动态内存管理使用称为“堆”的堆栈空间以外的东西。堆可以动态分配到任何必要的大小(受系统参数限制),但堆上分配的所有内存必须使用 malloc/free 调用对显式释放,因此程序员在动态内存管理方面承担了更多责任,但也更有可能搞砸访问释放的内存和悬挂指针等事情。

这是新手 C 程序员遇到的最重要的事情之一。 (通常是非简单的 malloc,例如动态 3D 数组等)

关于c - 如果你写了一个没有指针的 C 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24945530/

相关文章:

c++ - 为什么当对象引用不变时,允许更改作为指向另一个类的指针的成员变量?

c - 根据命令行参数将字符串合并在一起。

C 程序与共享库链接而不设置 LD_LIBRARY_PATH

c - 动态数组添加元素后打印乱码

c++ - (int *) (&a[2]) 和 *(&a[2]) 之间的区别

c++ - 使用指针是预取数据的好方法吗?

c - 将 free() 与通过函数接收地址的指针一起使用

c - gnu c on_exit - 段错误

c - ARM Cortex A9 双核(Linux 或 VxWorks)上的多线程

c++ - 在 ANTLR 生成的 C 解析器中使用 C++ 类型