#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr[3];
// 内存分配
arr[0] = (int *)malloc(2 * sizeof(int));
arr[1] = (int *)malloc(3 * sizeof(int));
arr[2] = (int *)malloc(1 * sizeof(int));
// 初始化
for (int i = 0; i < 3; i++) {
if (i == 0) {
for (int j = 0; j < 2; j++) {
arr[i][j] = i * j;
}
} else if (i == 1) {
for (int j = 0; j < 3; j++) {
arr[i][j] = i * j;
}
} else {
for (int j = 0; j < 1; j++) {
arr[i][j] = i * j;
}
}
}
// 输出验证
for (int i = 0; i < 3; i++) {
if (i == 0) {
for (int j = 0; j < 2; j++) {
printf("%d ", arr[i][j]);
}
} else if (i == 1) {
for (int j = 0; j < 3; j++) {
printf("%d ", arr[i][j]);
}
} else {
for (int j = 0; j < 1; j++) {
printf("%d ", arr[i][j]);
}
}
printf("\n");
}
// 释放内存
free(arr[0]);
free(arr[1]);
free(arr[2]);
return 0;
}
多维数组下标的概念与内存操作的联系
- 内存分配:通过
malloc
为每一行分配不同大小的内存空间,这是基于每行元素个数不同的特点。例如 arr[0] = (int *)malloc(2 * sizeof(int));
为第一行分配了能容纳2个 int
类型元素的空间。这里的行下标 0
对应着要分配内存的具体指针 arr[0]
。
- 初始化:使用双重循环来访问每个元素。外层循环控制行下标
i
,内层循环根据不同行的元素个数控制列下标 j
。如 arr[i][j] = i * j;
通过行下标 i
和列下标 j
计算出要初始化的值,并赋值给对应的内存位置。这里的 arr[i][j]
本质上是通过指针运算找到对应内存位置进行赋值,arr[i]
是指向第 i
行首元素的指针,arr[i][j]
相当于 *(arr[i] + j)
,即从第 i
行首元素开始偏移 j
个 int
大小的位置。
- 释放内存:根据之前分配内存时与行下标的对应关系,通过
free(arr[0]);
等语句释放每一行的内存,确保没有内存泄漏。行下标 0
、1
、2
分别对应要释放的不同行的内存指针。