三维数组指针定义和初始化例子

在Linux C环境下,定义一个三维的结构体数组指针并遍历它涉及几个步骤。

首先,需要定义一个结构体,然后定义一个指向这个结构体数组的指针,最后使用嵌套循环来遍历它。

咱们定义了一个名为Person的结构体,它包含nameage两个成员。然后定义了一个指向三维Person数组的指针,并遍历它。

示例:

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
  
// 定义Person结构体  
typedef struct {  
    char name[50];  
    int age;  
} Person;  
  
int main() {  
    // 定义三维数组的大小  
    const int depth = 2;  
    const int numRows = 3;  
    const int numCols = 4;  
  
    // 动态分配三维数组的内存  
    Person ***people = (Person ***)malloc(depth * sizeof(Person **));  
    if (people == NULL) {  
        perror("Failed to allocate memory for people array");  
        return EXIT_FAILURE;  
    }  
  
    for (int i = 0; i < depth; i++) {  
        people[i] = (Person **)malloc(numRows * sizeof(Person *));  
        if (people[i] == NULL) {  
            perror("Failed to allocate memory for a layer of people");  
            // 释放已经分配的内存  
            for (int j = 0; j < i; j++) {  
                free(people[j]);  
            }  
            free(people);  
            return EXIT_FAILURE;  
        }  
  
        for (int j = 0; j < numRows; j++) {  
            people[i][j] = (Person *)malloc(numCols * sizeof(Person));  
            if (people[i][j] == NULL) {  
                perror("Failed to allocate memory for a row of people");  
                // 释放已经分配的内存  
                for (int k = 0; k < j; k++) {  
                    free(people[i][k]);  
                }  
                free(people[i]);  
                // 释放之前已经分配的内存  
                for (int l = 0; l < i; l++) {  
                    free(people[l]);  
                }  
                free(people);  
                return EXIT_FAILURE;  
            }  
        }  
    }  
  
    // 初始化数组  
    for (int i = 0; i < depth; i++) {  
        for (int j = 0; j < numRows; j++) {  
            for (int k = 0; k < numCols; k++) {  
                snprintf(people[i][j][k].name, sizeof(people[i][j][k].name), "Person %d-%d-%d", i, j, k);  
                people[i][j][k].age = i * j * k + 10;  
            }  
        }  
    }  
  
    // 遍历三维数组  
    for (int i = 0; i < depth; i++) {  
        for (int j = 0; j < numRows; j++) {  
            for (int k = 0; k < numCols; k++) {  
                printf("Name: %s, Age: %d\n", people[i][j][k].name, people[i][j][k].age);  
            }  
        }  
    }  
  
    // 释放内存  
    for (int i = 0; i < depth; i++) {  
        for (int j = 0; j < numRows; j++) {  
            free(people[i][j]);  
        }  
        free(people[i]);  
    }  
    free(people);  
  
    return EXIT_SUCCESS;  
}

这个示例中:

  • 我们首先定义了三维数组的大小:depth(深度或层数)、numRows(行数)和numCols(列数)。
  • 然后,我们为三维数组的每一层分配了指向二维数组的指针数组的内存。
  • 对于每一层,我们又为每一行分配了指向一维数组的指针的内存。
  • 对于每一行,我们最后分配了存储Person结构体的内存。
  • 在初始化时,我们使用三层嵌套的循环来设置每个Person结构体的nameage字段。
  • 遍历数组时,我们使用三层嵌套的循环来访问并打印每个Person结构体的信息。
  • 最后,我们按照相反的顺序释放了之前分配的所有内存,首先释放每一行的内存,然后释放每一层的内存,最后释放整个三维数组的指针。

学废了么,<(* ̄▽ ̄*)/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值