什么是C中使用的“内存分配”?

时间:2014-03-01 20:58:57

标签: c memory memory-management

我总是在这里人们说有关内存和C的使用很困难,因为这个整个内存的东西,内存泄漏等等。我试过谷歌搜索'内存分配 - C',我发现的只是教程和东西。有人可以解释内存使用情况或分配吗?

如果这个问题不具有建设性,请原谅我,但不管怎样,谢谢!

2 个答案:

答案 0 :(得分:2)

大多数现代编程语言自动管理用于存储更高级别的程序数据(结构,对象等,取决于语言)的内存。相反,C要求程序员在编程时手动分配解除分配内存。这需要更多的工作,但也可以实现更高的性能(如果一个人是细致的)。

当分配内存块(例如,分配给C 结构)并且无法解除分配时(这意味着释放内存用于其他用途),会发生内存泄漏。在这种情况下,仍然分配内存,但不使用。加班,内存泄漏可能会减少可用内存量,并导致持久性程序出现问题。

答案 1 :(得分:2)

快速。 在大多数最近的语言中,当您创建新对象或数据结构时,必须首先为obj / struct创建位置。 然后你必须要求你的程序中的权限创建一个obj / struct放在这个位置。

在C中它有点复杂:首先它不是面向对象的,所以你只有结构。 因此,当您为结构创建位置时,您必须向编译器解释您需要精确类型的数据及其在内存中的大小。 您也没有可变大小的数组,或者在编译之前将知道您的数组大小,或者您必须进行动态分配。

示例: 在JAVA:

int x = 3;
FooClass [] obj;
FooClass = new FooClass[x];

在C:

int x = 3;
FooStruct *str; // This is a pointer: you are dealing with the memory adress
str = malloc(x * sizeof(FooStruct)); 
/* You are allocating x = 3 FooStruct elements at the adress str.
You have now an array of 3 FooStruct */

最后一点,在很多最近的语言中,你有垃圾收集器,但在C中,当你不想使用动态分配的元素时,你必须解除它。

如果您没有经验,那可能会很危险,因为在处理内存中的地址时,您可以执行不允许的操作,例如使用程序外部的内存地址(即使它已被保护)。