c - C 填充二维数组
问题描述
我正在做交流项目。我需要用数字填充这个数组。但是当我尝试这样的事情时,它会给出分段错误。你有什么建议?
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int **my2DArray;
my2DArray = malloc(4 * sizeof(int));
for(int i=0; i<4; i++) {
my2DArray[i] = malloc(5 * sizeof(int));
}
for(int i=0; i<4; i++) {
for(int j=0; j<5; j++) {
my2DArray[i][j] = 1;
}
}
for(int i=0; i<4; i++) {
for(int j=0; j<5; j++) {
printf("%d", my2DArray[i][j]);
}
}
for(int i=0; i<4; i++) {
// error happens here
free(my2DArray[i]);
}
free(my2DArray);
return 0;
}
解决方案
它给出了分割错误。
sizeof(int)
不是 所指向的类型的大小int **my2DArray
。
my2DArray
是指向 int 的指针,因此指向 a int *
。
可能在 OP 的平台上 anint
小于 a int*
。
你有什么建议?
与其花费精力对匹配类型进行编码(并且可能会出错),不如将大小调整为取消引用的指针。更容易正确编码、审查和维护。
int **my2DArray;
// my2DArray = malloc(4*sizeof(int));
my2DArray = malloc(sizeof *my2DArray * 4); // no type needed
// ^---------------^ // Size of the de-referenced type
健壮的代码将检测分配失败
my2DArray = malloc(sizeof *my2DArray * element_count);
if (my2DArray == NULL && element_count > 0) {
// Handle out-of-memory in some fashion
fprintf(stderr, "Out of memory\n");
exit (EXIT_FAILURE);
}
推荐阅读
- openrefine - 在 OpenRefine 中,如何使用正则表达式查找/替换首字母?
- android - 在 ActionBar Kotlin 上实现下一个按钮
- javascript - ReactJS 从 div 数组更新 DIV
- java - 如何从 Firebase 中的实时数据库中检索数据?
- java - RecyclerView的加载时间问题
- sql - Invoke-SQLcmd:“@”附近的语法不正确。消息 102,级别 15,状态 1,程序,第 5 行
- java - Groovy 脚本中的 XMLSlurper 不适用于简单的 XML
- azure-logic-apps - 有没有一种(简单的)方法可以从 HTTP 标头参数中提取子字符串?
- reactjs - 在 Redux 中获取数据时,Action Payload 返回未定义
- sql - 使用 Posgtres JSON 函数从与其他表有关系的表中生成完整的 JSON 对象