C语言初始化全场景解析:从静态到动态的 7 种写法

静态初始化:编译时确定数据

场景 1:规则二维数组(行列固定)

// 完整初始化
float scores[3][4] = {
{85.5, 90.0, 78.5, 92.0},
{77.0, 88.5, 95.0, 80.0},
{99.0, 85.0, 82.5, 90.5}
};
// 部分初始化(未填写的元素补0)
int sparse[2][3] = { {1}, {2} };
// 存储结果:
// [1, 0, 0]
// [2, 0, 0]

场景 2:不规则二维数组(行长度不同,需动态分配)

静态数组必须行列固定,若需每行长度不同(如存储不同长度的字符串),需用动态分配(见 3.2 节)。

3.2 动态初始化:运行时分配内存

方法 1:二级指针实现动态二维数组

#include <stdlib.h>

// 分配m行n列的二维数组
int** create_2d_array(int m, int n) {
int** arr = (int**)malloc(m * sizeof(int*)); // 分配m个行指针
for (int i = 0; i < m; i++) {
arr[i] = (int*)malloc(n * sizeof(int)); // 每行分配n个元素
for (int j = 0; j < n; j++) {
arr[i][j] = i * n + j; // 初始化元素值
}
}
return arr;
}

// 释放内存(重要!避免内存泄漏)
void free_2d_array(int** arr, int m) {
for (int i = 0; i < m; i++) {
free(arr[i]);
}
free(arr);
}

注意:动态二维数组的每行内存可能不连续(除非用连续分配法,见 3.3 节)。

方法 2:一维指针模拟连续二维数组(性能优化)

// 分配m行n列的连续内存块
int* create_continuous_2d_array(int m, int n) {
int* arr = (int*)malloc(m * n * sizeof(int));
// 访问元素:arr[i * n + j]
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
arr[i * n + j] = i * n + j;
}
}
return arr;
}

优势:内存连续,缓存命中率高,适合高频访问场景(如矩阵运算)。

3.3 特殊初始化:全零、随机值、文件读取

场景 1:全零初始化

// 静态数组:部分初始化+自动补零
int zero_matrix[3][4] = {0}; // 所有元素初始化为0
// 动态数组:用calloc替代malloc(自动置零)
int** arr = (int**)calloc(m, sizeof(int*));

场景 2:从文件读取数据初始化

FILE* file = fopen(“data.txt”, “r”);
int matrix[3][4];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
fscanf(file, “%d”, &matrix[i][j]);
}
}
fclose(file);

欢迎使用66资源网
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
7. 本站有不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别!

66源码网 » C语言初始化全场景解析:从静态到动态的 7 种写法

提供最优质的资源集合

立即查看 了解详情