MST

星途 面试题库

面试题:C语言二维数组初始化的复杂场景

假设有一个5行5列的二维整数数组,要求使用动态内存分配并通过不同的初始化方式(如部分初始化、按行初始化等)来设置数组的值,使得数组对角线上的元素为1,其余元素为0。编写完整的C代码实现这一功能,并解释每种初始化方式的特点。
49.3万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>
#include <stdlib.h>

// 部分初始化方式
void partialInitialization(int **arr, int size) {
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            if (i == j) {
                arr[i][j] = 1;
            } else {
                arr[i][j] = 0;
            }
        }
    }
}

// 按行初始化方式
void rowInitialization(int **arr, int size) {
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            arr[i][j] = 0;
        }
        arr[i][i] = 1;
    }
}

// 打印数组
void printArray(int **arr, int size) {
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
}

int main() {
    int size = 5;
    int **arr = (int **)malloc(size * sizeof(int *));
    for (int i = 0; i < size; i++) {
        arr[i] = (int *)malloc(size * sizeof(int));
    }

    // 使用部分初始化方式
    partialInitialization(arr, size);
    printf("部分初始化后的数组:\n");
    printArray(arr, size);

    // 释放内存
    for (int i = 0; i < size; i++) {
        free(arr[i]);
    }
    free(arr);

    // 重新分配内存
    arr = (int **)malloc(size * sizeof(int *));
    for (int i = 0; i < size; i++) {
        arr[i] = (int *)malloc(size * sizeof(int));
    }

    // 使用按行初始化方式
    rowInitialization(arr, size);
    printf("\n按行初始化后的数组:\n");
    printArray(arr, size);

    // 释放内存
    for (int i = 0; i < size; i++) {
        free(arr[i]);
    }
    free(arr);

    return 0;
}

部分初始化方式特点

  • 初始化逻辑:在遍历二维数组的每一个元素时,判断当前元素是否在对角线上,如果是则赋值为1,否则赋值为0。
  • 优点:逻辑直接,易于理解,能够精确控制每个元素的赋值过程。
  • 缺点:对于大型数组,这种逐个元素判断的方式可能效率较低,因为每次循环都要进行条件判断。

按行初始化方式特点

  • 初始化逻辑:先将每一行的所有元素初始化为0,然后再将每行的对角元素赋值为1。
  • 优点:先整体初始化每行,减少了条件判断的次数,对于大型数组在一定程度上提高了初始化效率。
  • 缺点:代码结构相对复杂一点,需要先进行整体初始化,再进行对角线元素的特殊赋值。