问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C语言实现一维动态数组:内存分配与指针操作详解

创作时间:
作者:
@小白创作中心

C语言实现一维动态数组:内存分配与指针操作详解

引用
1
来源
1.
https://docs.pingcode.com/baike/1035818

C语言中的一维动态数组实现是编程中的一个重要知识点。本文将详细介绍如何使用malloc函数动态分配内存、通过指针操作数组元素,以及如何释放内存。通过本文的学习,你将掌握动态数组的基本操作方法。

一、动态内存分配

C语言中的动态内存分配主要通过标准库函数malloccallocrealloc实现。malloc函数是最常用的,可以为指定字节数的内存分配空间。

使用malloc函数

malloc函数用于在堆区分配指定字节数的连续内存空间,并返回一个指向该内存空间的指针。如果分配失败,返回NULL。其函数原型如下:

void* malloc(size_t size);

例如,我们想要分配一个包含10个int类型元素的动态数组,可以这样实现:

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

int main() {
    int n = 10;
    int *array = (int*)malloc(n * sizeof(int));  // 分配内存
    if (array == NULL) {
        fprintf(stderr, "内存分配失败\n");
        return 1;
    }
    for (int i = 0; i < n; i++) {
        array[i] = i;
    }
    for (int i = 0; i < n; i++) {
        printf("%d ", array[i]);
    }
    printf("\n");
    free(array);  // 释放内存
    return 0;
}

二、指针操作数组

在C语言中,指针和数组有着密切的关系。数组名其实是指向数组首元素的指针。通过指针,我们可以方便地操作动态数组的元素。

访问和修改数组元素

在上面的例子中,我们通过数组下标访问和修改数组元素。实际上,数组下标访问的本质是指针偏移。例如,array[i]相当于*(array + i)。因此,下面的代码与上面的例子效果相同:

for (int i = 0; i < n; i++) {
    *(array + i) = i;  // 通过指针操作数组元素
}
for (int i = 0; i < n; i++) {
    printf("%d ", *(array + i));  // 通过指针访问数组元素
}
printf("\n");

使用指针遍历数组

我们还可以直接使用指针遍历数组,而不是通过数组下标:

int *ptr = array;
for (int i = 0; i < n; i++) {
    *(ptr + i) = i;  // 通过指针操作数组元素
}
ptr = array;
for (int i = 0; i < n; i++) {
    printf("%d ", *(ptr + i));  // 通过指针访问数组元素
}
printf("\n");

三、释放内存

动态分配的内存必须通过free函数释放,以避免内存泄漏。free函数的原型如下:

void free(void *ptr);

在释放内存后,最好将指针置为NULL,以避免使用未定义行为的悬挂指针。

四、重新分配内存

有时,我们需要调整动态数组的大小,可以使用realloc函数。realloc可以重新分配内存,并将原来内容复制到新内存区域。其函数原型如下:

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

例如,我们将之前的数组大小调整为20:

int *new_array = (int*)realloc(array, 20 * sizeof(int));
if (new_array == NULL) {
    fprintf(stderr, "内存重新分配失败\n");
    free(array);  // 释放原来的内存
    return 1;
}
array = new_array;  // 更新指针
for (int i = 10; i < 20; i++) {
    array[i] = i;
}
for (int i = 0; i < 20; i++) {
    printf("%d ", array[i]);
}
printf("\n");
free(array);  // 释放内存

五、完整实现示例

结合上面的内容,以下是一个完整的C语言程序,展示了如何实现一维动态数组,包括动态分配内存、使用指针操作数组、重新分配内存以及释放内存:

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

int main() {
    int n = 10;
    int *array = (int*)malloc(n * sizeof(int));  // 分配内存
    if (array == NULL) {
        fprintf(stderr, "内存分配失败\n");
        return 1;
    }
    for (int i = 0; i < n; i++) {
        array[i] = i;
    }
    for (int i = 0; i < n; i++) {
        printf("%d ", array[i]);
    }
    printf("\n");
    // 重新分配内存
    int *new_array = (int*)realloc(array, 20 * sizeof(int));
    if (new_array == NULL) {
        fprintf(stderr, "内存重新分配失败\n");
        free(array);  // 释放原来的内存
        return 1;
    }
    array = new_array;  // 更新指针
    for (int i = 10; i < 20; i++) {
        array[i] = i;
    }
    for (int i = 0; i < 20; i++) {
        printf("%d ", array[i]);
    }
    printf("\n");
    free(array);  // 释放内存
    return 0;
}

通过上述示例,我们详细讲解了如何在C语言中实现一维动态数组,涉及内存动态分配、指针操作数组、重新分配内存以及释放内存。掌握这些内容后,我们可以更灵活地管理内存,提高程序的效率和可靠性。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号