动态内存的申请

C语言的内存分配

C语言分配内存分配方式主要分为动态分配和静态分配。

静态分配是指:
  1. 在程序编译或运行过程中,按事先规定大小分配内存空间的分配方式。int a [10]
  2. 必须事先知道所需空间的大小。
  3. 分配在栈区或全局变量区,一般以数组的形式。
  4. 按计划分配。
动态分配是指:
  1. 在程序运行的时候,根据需要的大小自由的分配空间
  2. 分配在堆区,一般使用特定的函数进行分配。

C语言的动态分配内存

C语言是一种非常强大的编程语言,它提供了多种动态分配内存的方法,这些方法可以帮助我们更好地管理内存,提高程序的效率。下面将讲解动态分配内存的所有方法,并提供详细的代码示例。

malloc函数

malloc函数是C语言中最常用的动态分配内存的方法之一。它可以在运行时动态地分配指定大小的内存空间,并返回一个指向该内存空间的指针。malloc函数的原型如下:

void *malloc(size_t size);

其中,size_t是一个无符号整数类型,表示要分配的内存空间的大小,单位是字节。malloc函数返回一个void类型的指针,指向分配的内存空间的起始地址。如果分配失败,则返回NULL。

下面是一个使用malloc函数动态分配内存的示例代码:

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

int main() {
    int *p;
    p = (int *)malloc(sizeof(int));
    if (p == NULL) {
        printf("Failed to allocate memory.\n");
        return -1;
    }
    *p = 123;
    printf("The value of p is %d.\n", *p);
    free(p);
    return 0;
}

在这个示例代码中,我们首先定义了一个int类型的指针p,然后使用malloc函数分配了一个int类型的内存空间,并将其赋值给p。如果分配失败,则输出错误信息并返回-1。如果分配成功,则将123赋值给p所指向的内存空间,并输出p的值。最后,使用free函数释放p所指向的内存空间。

calloc函数

calloc函数也是C语言中常用的动态分配内存的方法之一。它可以在运行时动态地分配指定数量和大小的内存空间,并返回一个指向该内存空间的指针。calloc函数的原型如下:

void *calloc(size_t nmemb, size_t size);

其中,nmemb是一个无符号整数类型,表示要分配的内存空间的数量,size是一个无符号整数类型,表示每个内存空间的大小,单位是字节。calloc函数返回一个void类型的指针,指向分配的内存空间的起始地址。如果分配失败,则返回NULL。

下面是一个使用calloc函数动态分配内存的示例代码:

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

int main() {
    int *p;
    p = (int *)calloc(1, sizeof(int));
    if (p == NULL) {
        printf("Failed to allocate memory.\n");
        return -1;
    }
    *p = 123;
    printf("The value of p is %d.\n", *p);
    free(p);
    return 0;
}

在这个示例代码中,我们首先定义了一个int类型的指针p,然后使用calloc函数分配了一个int类型的内存空间,并将其赋值给p。如果分配失败,则输出错误信息并返回-1。如果分配成功,则将123赋值给p所指向的内存空间,并输出p的值。最后,使用free函数释放p所指向的内存空间。

realloc函数

realloc函数是C语言中另一个常用的动态分配内存的方法。它可以在运行时重新分配已经分配的内存空间的大小,并返回一个指向该内存空间的指针。realloc函数的原型如下:

void *realloc(void *ptr, size_t size);

其中,ptr是一个指向已经分配的内存空间的指针,size是一个无符号整数类型,表示重新分配后的内存空间的大小,单位是字节。realloc函数返回一个void类型的指针,指向重新分配后的内存空间的起始地址。如果分配失败,则返回NULL。

使用realloc函数时需要注意以下几点:

  1. 如果重新分配的内存块大小比原来的内存块大小小,那么原来的内存块中多余的部分将会被截断,而且其中的数据也会丢失。

  2. 如果重新分配的内存块大小比原来的内存块大小大,那么新分配的内存块中多余的部分将会被初始化为0。

下面是一个使用realloc函数动态分配内存的示例代码:

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

int main() {
    int *p;
    p = (int *)malloc(sizeof(int));
    if (p == NULL) {
        printf("Failed to allocate memory.\n");
        return -1;
    }
    *p = 123;
    printf("The value of p is %d.\n", *p);
    p = (int *)realloc(p, sizeof(int) * 2);
    if (p == NULL) {
        printf("Failed to reallocate memory.\n");
        return -1;
    }
    *(p + 1) = 456;
    printf("The value of p[0] is %d.\n", *p);
    printf("The value of p[1] is %d.\n", *(p + 1));
    free(p);
    return 0;
}

在这个示例代码中,我们首先定义了一个int类型的指针p,然后使用malloc函数分配了一个int类型的内存空间,并将其赋值给p。如果分配失败,则输出错误信息并返回-1。如果分配成功,则将123赋值给p所指向的内存空间,并输出p的值。接着,使用realloc函数重新分配p所指向的内存空间的大小为2个int类型的大小,并将其赋值给p。如果分配失败,则输出错误信息并返回-1。如果分配成功,则将456赋值给p所指向的第二个int类型的内存空间,并输出p的值。最后,使用free函数释放p所指向的内存空间。

alloca函数

alloca函数是C语言中的一个函数,它可以在程序运行时动态分配内存。与malloc和calloc函数不同,alloca函数分配的内存是在堆栈上而不是在堆上。这意味着在函数返回时,分配的内存将自动被释放,而不需要显式地调用free函数。

使用alloca函数的语法非常简单,只需要在函数中调用它并传递所需的内存大小即可。下面是一个简单的示例:

#include <stdio.h>
#include <alloca.h>

int main() {
    int n = 10;
    int *arr = alloca(n * sizeof(int));
    
    for (int i = 0; i < n; i++) {
        arr[i] = i;
    }
    
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    
    return 0;
}

在这个示例中,我们使用alloca函数动态分配了一个大小为n * sizeof(int)的整数数组。然后,我们使用for循环将数组的每个元素初始化为其下标值,并使用另一个for循环打印数组的所有元素。

需要注意的是,由于alloca函数分配的内存是在堆栈上而不是在堆上,因此它的使用应该受到一些限制。特别是,分配的内存大小应该是相对较小的,以避免堆栈溢出的风险。此外,由于分配的内存是在堆栈上,因此它的生命周期仅限于函数的执行期间。因此,如果需要在函数返回后继续使用分配的内存,应该使用malloc或calloc函数来分配内存。

总之,alloca函数是C语言中一个非常有用的函数,它可以帮助程序员在程序运行时动态分配内存。虽然它的使用应该受到一些限制,但在某些情况下,它可以是一个非常方便的工具。

C语言内存泄漏

内存泄漏是指程序在运行过程中分配的内存空间没有被及时释放,导致系统内存资源的浪费和程序性能下降。在C语言中,内存泄漏是一个常见的问题,如果不及时处理,会导致程序崩溃或者运行缓慢。

一、内存泄漏的原因

1.未释放动态分配的内存

在C语言中,使用malloc、calloc、realloc等函数动态分配内存空间,如果在使用完后没有及时释放,就会导致内存泄漏。例如:

int *p = (int*)malloc(sizeof(int)*10);
//使用p指向的内存空间
//忘记释放p指向的内存空间

2.指针赋值错误

在使用指针变量时,如果指针变量赋值错误,就会导致内存泄漏。例如:

int *p = (int*)malloc(sizeof(int)*10);
int *q = p;
//忘记释放q指向的内存空间

3.函数返回值未释放

在函数中使用malloc等函数动态分配内存空间,如果在函数返回后没有及时释放,就会导致内存泄漏。例如:

int *func(){
    int *p = (int*)malloc(sizeof(int)*10);
    return p;
}
int *q = func();
//忘记释放q指向的内存空间
二、内存泄漏的解决方法

1.及时释放动态分配的内存

在使用完动态分配的内存空间后,应该及时使用free函数释放内存。例如:

int *p = (int*)malloc(sizeof(int)*10);
//使用p指向的内存空间
free(p);

2.避免指针赋值错误

在使用指针变量时,应该避免指针赋值错误,确保每个指针变量都指向正确的内存空间。例如:

int *p = (int*)malloc(sizeof(int)*10);
int *q = (int*)malloc(sizeof(int)*10);
//使用p和q指向的内存空间
free(p);
free(q);

3.在函数中动态分配内存空间后,及时释放

在函数中使用malloc等函数动态分配内存空间时,应该在函数返回前及时释放内存空间。例如:

int *func(){
    int *p = (int*)malloc(sizeof(int)*10);
    return p;
}
int *q = func();
//使用q指向的内存空间
free(q);
三、代码示例

下面是一个内存泄漏的代码示例:

#include <stdio.h>
#include <stdlib.h>
int main(){
    int *p = (int*)malloc(sizeof(int)*10);
    p[0] = 1;
    p[1] = 2;
    //使用p指向的内存空间
    //忘记释放p指向的内存空间
    return 0;
}

下面是一个解决内存泄漏的代码示例:

#include <stdio.h>
#include <stdlib.h>
int main(){
    int *p = (int*)malloc(sizeof(int)*10);
    p[0] = 1;
    p[1] = 2;
    //使用p指向的内存空间
    free(p);
    return 0;
}

总之,内存泄漏是一个常见的问题,在C语言中尤为突出。我们应该注意及时释放动态分配的内存空间,避免指针赋值错误,以及在函数中动态分配内存空间后及时释放。这样可以有效地避免内存泄漏问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

末、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值