面试题答案
一键面试#include <stdio.h>
#include <stdlib.h>
int main() {
int rows = 3; // 定义二维数组的行数
int cols = 4; // 定义二维数组的列数
// 动态分配一个指针数组,这个指针数组中的每个元素都将指向一个一维数组
int **arr = (int **)malloc(rows * sizeof(int *));
if (arr == NULL) {
printf("内存分配失败\n");
return 1;
}
// 为每一行分配内存
for (int i = 0; i < rows; i++) {
arr[i] = (int *)malloc(cols * sizeof(int));
if (arr[i] == NULL) {
printf("内存分配失败\n");
// 释放已经分配的内存
for (int j = 0; j < i; j++) {
free(arr[j]);
}
free(arr);
return 1;
}
}
// 初始化二维数组元素
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
arr[i][j] = i * cols + j; // 简单的初始化,值为行号 * 列数 + 列号
}
}
// 打印二维数组
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
printf("%d ", arr[i][j]);
}
printf("\n");
}
// 释放为每一行分配的内存
for (int i = 0; i < rows; i++) {
free(arr[i]);
}
// 释放指针数组
free(arr);
return 0;
}
-
定义行数和列数:
int rows = 3; int cols = 4;
这里定义了要创建的二维数组的行数为3,列数为4。
-
分配指针数组的内存:
int **arr = (int **)malloc(rows * sizeof(int *));
malloc(rows * sizeof(int *))
分配了一块内存,大小为rows
个int *
类型的空间,也就是可以存放rows
个指针,这些指针将分别指向每一行的一维数组。然后将分配的内存地址转换为int **
类型并赋值给arr
。检查arr
是否为NULL
,如果是,说明内存分配失败,打印错误信息并退出程序。 -
为每一行分配内存:
for (int i = 0; i < rows; i++) { arr[i] = (int *)malloc(cols * sizeof(int)); if (arr[i] == NULL) { printf("内存分配失败\n"); for (int j = 0; j < i; j++) { free(arr[j]); } free(arr); return 1; } }
外层循环遍历
rows
,对于每一行i
,malloc(cols * sizeof(int))
分配了一块内存,大小为cols
个int
类型的空间,也就是每一行的一维数组。同样检查分配是否成功,如果失败,释放已经分配的行内存和指针数组内存,并退出程序。 -
初始化二维数组元素:
for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { arr[i][j] = i * cols + j; } }
嵌套的两层循环遍历整个二维数组,使用
i * cols + j
的方式简单初始化每个元素的值。 -
打印二维数组:
for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { printf("%d ", arr[i][j]); } printf("\n"); }
同样是嵌套的两层循环遍历二维数组,按行打印每个元素的值,每行结束后换行。
-
释放内存:
for (int i = 0; i < rows; i++) { free(arr[i]); } free(arr);
首先释放每一行分配的内存,然后释放指针数组分配的内存,避免内存泄漏。