章节索引 :

C 语言中的 maclloc free()

在几乎所有的情况下, C 语言都可以自动的来分配内存,这不需要你的参与。这很高效,也很安全。这也是目前主流语言所采取的策略。但是 C 语言除了系统自动分配和回收内存,还可以自己手动来分配和回收内存,让你的程序更具有灵活性。

1. 动态分配内存

int *x;
x = (int *)maclloc(32);

maclloc 函数的参数是分配的内存的大小,这个值我们也可以根据不同变量类型通过 sizeof 这个函数来获得。其返回值是一个无类型的指针。所以这里我们用了显示的类型转换,将其转换与指针变量类型相同的指针。

2. 回收动态分配的内存

回收动态分配的内存需要传入指针变量即可。

free(x);

这样就释放了我们之前动态分配的内存空间。

3. 示例程序

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int *x;
    printf("x value: %p, x address: %p, *x value: %d\n", x, &x, *x);
    x = (int *)malloc(sizeof(x));
    printf("x value: %p, x address: %p, *x value: %d\n", x, &x, *x);
    *x = 10;
    printf("x value: %p, x address: %p, *x value: %d\n", x, &x, *x);
    free(x);

    return 0;
}

运行结果:

x value: 0x7fffeac6bd50, x address: 0x7fffeac6bc60, *x value: 1
x value: 0x7fffe3916270, x address: 0x7fffeac6bc60, *x value: 0
x value: 0x7fffe3916270, x address: 0x7fffeac6bc60, *x value: 10

程序中声明了一个整数型的指针,然后对这个指针分配了一块内存。把这个分配好的内存地址给了指针变量。然后对这个地址所表示的变量进行赋值。最后再回收分配的内存。

4. 小结

动态内存分配可以说是 C 语言程序员的噩梦。我们可能会遇到如果分配了内存,但是在最后没有回收内存。这种情况就如同内存空洞存在,会不断的使系统的可用内存减少,因此称之为内存泄露。这是非常常见的内存分配的错误。很多著名的软件也都会存在这种问题。最简单的解决办法就是通过定期重启程序来解决。还有一种常见错误就是使用没有成功分配的内存地址。这也会引起莫名的错误。

同时使用分配内存的函数会消耗一定的资源,因为这会让 C 语言调用与系统之间的 API ,会拖慢程序的运行。大量的调用会产生性能问题。

所以在进行涉及计算机或者其他设备硬件资源操作的时候,一定要谨慎。因为这些资源是有限的,一旦被占用了,可利用的资源数量就会减少。直至资源的耗尽。