指针动态分配空间malloc()

本文详细介绍了使用C语言进行动态内存分配的方法,包括如何利用malloc函数申请内存,并通过检查返回值确保分配成功,以及如何使用free函数释放内存,避免产生野指针,保持程序稳定运行。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main()
{
        char *p = (char*)malloc(sizeof(char)*100);
        if(NULL==p){
                printf("the malloc is error\n");
                return -1;
        }
        strcpy(p,"hello");
        printf("p->%u,p->%s\n",p,p);
        free(p);


        return 0;
}
~     

在动态分配空间时,需要先检查是否分配成功,检查NULL==p,

程序结束时需要释放分配的指针,防止产生野指针,影响程序的稳定性

### 指针动态分配空间的原理 在程序运行过程中,根据实际需求在堆内存中申请和使用一定大小的存储空间,而非在编译时就确定内存大小。程序可以在运行时灵活地分配和释放内存,以满足不同的需求。例如,在使用指针进行动态内存分配时,程序会向操作系统请求一块指定大小的内存区域,操作系统会在堆中找到合适的空闲空间并将其分配给程序,同时返回该内存区域的起始地址,这个地址就可以存储在指针变量中,通过指针来访问和操作这块动态分配的内存[^1][^3][^4]。 ### 指针动态分配空间的方法 - **malloc函数**:用于分配指定字节数的内存块,返回一个指向该内存块起始地址的指针。如果分配失败,返回`NULL`。函数原型为`void* malloc(size_t size);`,使用时需要将返回的`void*`类型指针强制转换为所需的指针类型。例如`p = (int*)malloc(n * sizeof(int));`,这里是为`n`个`int`类型的元素分配内存空间,将返回的地址存储在指针`p`中[^1][^3][^4]。 - **calloc函数**:用于分配指定数量和每个元素大小的连续内存块,并将所有字节初始化为0。函数原型为`void* calloc(size_t num, size_t size);`,同样需要进行强制类型转换。例如`p=(int*)calloc(n, sizeof(int));`,这里也是为`n`个`int`类型的元素分配内存空间,并初始化为0。 - **realloc函数**:用于调整之前动态分配的内存块的大小。函数原型为`void* realloc(void* ptr, size_t size);`,`ptr`是之前通过`malloc`、`calloc`或`realloc`分配的内存块的指针,`size`是新的内存块大小。如果调整成功,返回指向新内存块的指针;如果失败,返回`NULL`,原内存块内容不变。 ### 指针动态分配空间的示例 #### 计算平均值示例 ```cpp #include <iostream> using namespace std; float average(int *p, int n) { int i; float ave = 0; for (i = 0; i < n; i++) ave += *(p + i); return ave / n; } int main() { int i, n, *p; cin >> n; p = (int*)malloc(n * sizeof(int)); for (i = 0; i < n; i++) scanf("%d", p + i); printf("%.2f\n", average(p, n)); free(p); return 0; } ``` 在这个示例中,程序首先从用户输入获取元素数量`n`,然后使用`malloc`函数为`n`个`int`类型的元素分配内存空间,接着通过循环读取用户输入的元素值,调用`average`函数计算这些元素的平均值并输出,最后使用`free`函数释放动态分配的内存[^3]。 #### 冒泡排序示例 ```c #include <stdio.h> void pop(int *array, int num) { int i, j, temp; for (i = 0; i < num; i++) for (j = 0; j < num - i - 1; j++) { if (*(array + j) > *(array + j + 1)) { temp = *(array + j); *(array + j) = *(array + j + 1); *(array + j + 1) = temp; } } } int main() { int num, i; printf("how much number you need:"); scanf("%d", &num); int *array = (int *)malloc(num * sizeof(int)); for (i = 0; i < num; i++) { scanf("%d", &array[i]); } pop(array, num); for (i = 0; i < num; i++) printf("%d ", *(array + i)); printf("\n"); free(array); return 0; } ``` 此示例中,程序先让用户输入需要排序的元素数量`num`,利用`malloc`函数为这些元素分配内存空间,再通过循环读取用户输入的元素值,调用`pop`函数对这些元素进行冒泡排序,最后输出排序后的元素并释放动态分配的内存[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值