我知道这个问题已得到解答,但它对我来说不起作用。 我为这样的数组动态分配内存:
arr = (int**)(malloc(rows*sizeof(int*)));
arr[0] = (int*)(malloc(rows*columns*sizeof(int))); // <-- THIS DOESN'T WORK
printf("\nArray: \n");
while(fscanf(fp, "%d", &num) == 1) {
//arr[row] = (int*)(malloc(columns*sizeof(int))); <---THIS WORKS
arr[row][col] = num;
printf("%d ", arr[row][col]);
if((++col == columns)){
row++;
col = 0;
printf("\n");
}
}
如果矩阵为6x6,则在第4行之后抛出分段错误。 有什么建议?感谢
编辑: 请参阅:http://www.geeksforgeeks.org/dynamically-allocate-2d-array-c/点编号4.如果我在第3点中执行此操作,则可行。但我需要像4那样。
答案 0 :(得分:7)
在任何情况下都不应该像你一样使用碎片化的malloc调用。它是广泛传播但是错误和不正确的做法。正如你所指出的,它不会在相邻的内存中给你一个真正的2D数组,而是一个零散的,慢的混乱。
如何正确地做到这一点:
在标准C中,写
int (*arr)[rows][columns] = malloc (sizeof(*arr));
(*arr)[r][c] = something;
...
free(arr);
或者如果您更喜欢使用更容易阅读的语法(但可能更难理解):
int (*arr)[columns] = malloc (sizeof(int[rows][columns]));
arr[r][c] = something;
...
free(arr);
在过时的C版本中,你必须编写一个&#34;受损的数组&#34;:
int* arr = malloc(rows * columns * sizeof(*arr));
arr[r*c] = something;
...
free(arr);
答案 1 :(得分:5)
要分配连续的内存,您必须使用
arr = malloc(sizeof(int *) * rows);
arrayData = malloc(sizeof(int) * columns * rows);
for(i = 0; i < rows; i++)
arr[i] = arrayData + i * columns ;
要解除分配你需要
free( arrData );
free( arr );
请参阅here
答案 2 :(得分:2)
您需要为每个(year-1)*12+month
分配内存,而不仅仅是第一个row
。取代
row
与
arr[0] = (int*)(malloc(rows*columns*sizeof(int)));
此处所做的更改是:
for(int i = 0; i < rows; i++)
arr[i] = malloc(columns * sizeof(int));
个字节的内存。columns * sizeof(int)
的结果毫无意义。我已将其删除。您可能需要在循环中添加一个检查以防止溢出。像
这样的东西malloc
固定代码是
if(row == rows)
{
puts("Matrix full; Exiting loop...");
break;
}
答案 3 :(得分:2)
对于6x6矩阵,动态内存过度。你应该简单地使用:
int arr[rows][cols];
这样更简单,更清洁,更快速,更不易出错,并且通常更安全 - 只要您保持矩阵尺寸足够小以便它可以轻松地放在堆叠上。如果您需要一个大型矩阵(例如,从1 MiB向上,但您需要调整阈值以适应您的系统),那么动态内存是相关的。
您可以对arr[0]
进行单一分配,但必须对每个arr[1]
到arr[5]
进行明确分配。我是这样做的:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int rows = 6;
int cols = 6;
int **arr = (int**)(malloc(rows*sizeof(int*)));
arr[0] = (int*)(malloc(rows*cols*sizeof(int)));
for (int i = 1; i < rows; i++)
arr[i] = arr[i-1] + cols;
printf("\nArray: \n");
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
arr[i][j] = (i+1) * (cols + 1 - j);
}
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
printf("%3d", arr[i][j]);
putchar('\n');
}
free(arr[0]);
free(arr);
return(0);
}
示例输出:
Array:
7 6 5 4 3 2
14 12 10 8 6 4
21 18 15 12 9 6
28 24 20 16 12 8
35 30 25 20 15 10
42 36 30 24 18 12
运行valgrind
可以提供清晰的健康状况。