我认为当你使用指针时,你总是在使用动态内存。这不是真的吗?
不,这不是真的,例如
int i;
int *p = &i; // uses a pointer to static memory, no dynamic memory.
但是,我似乎在声明一个指针时使用了动态内存,例如 char* p,我没有为其指定字符数组的长度
char[100] string;
char* p = &(string[0]); // Same as above, no dynamic memory.
当您无法判断数据结构需要多大时,您需要动态内存。
假设您必须从文件中读取一些整数并将它们存储在内存中。你不知道你需要多少个整数。你可以选择一个 100 的数字,但是如果有 101,那么你的程序就会中断。你可以选择 100,000,希望这已经足够了,但是如果文件中只有 10,那么它会浪费资源,同样,如果文件中有 100,001 个整数,它就会中断文件。
在这种情况下,您的程序可以遍历文件,计算整数的数量,然后动态创建正确大小的数组。然后您再次传递文件,将整数读取到新数组中。
Static v 的动态内存
静态内存是静态的,因为程序一旦编译就无法更改,它是静态的。您在函数中声明的变量以及在类/结构上声明的成员是静态的。当每个方法被调用时,编译器会准确计算它需要多少个。
动态内存是一个内存“池”,可以在运行时按需供您的程序使用。编译器只知道它需要分配一些(可能是未知的)内存量,并将该内存释放回动态内存池。
希望这可以帮助。
PS是的,有更有效的方法可以将未知数量的项目放入内存,但这是最简单的解释