2D数组作为连续的内存块

时间:2015-10-05 06:01:39

标签: c arrays memory malloc

我知道这个问题已得到解答,但它对我来说不起作用。 我为这样的数组动态分配内存:

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那样。

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)));

此处所做的更改是:

  1. 所有行都将分配for(int i = 0; i < rows; i++) arr[i] = malloc(columns * sizeof(int)); 个字节的内存。
  2. 在{C}中投射columns * sizeof(int)的结果毫无意义。我已将其删除。
  3. 您可能需要在循环中添加一个检查以防止溢出。像

    这样的东西
    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可以提供清晰的健康状况。