如何将malloc用于二维数组?

时间:2014-05-08 06:27:44

标签: c arrays

我需要创建一个二维数组。现在我把它创建为 int a[100][100]

但我需要使用C语言中的MALLOC动态分配内存。我用了代码

#include <stdio.h>
#include<stdlib.h>



int main(void)
{     
int n=6,m=5,i,j;
    int **a = malloc(n * sizeof(int *));
    for(i = 0; i < m; i++)
          a[i] = malloc(m * sizeof(int));

    for( i = 1 ; i <= n ; i++ )
    {
        for( j = 1 ; j <= m ; j++ )
        {
            scanf("%d %d",&a[i][j]);
        }
    }

    return 0;
}

但现在在将元素输入数组时,它显示了SEGMENTATION ERROR。

5 个答案:

答案 0 :(得分:1)

你只需要

long *a = malloc(100*100*sizeof(long));

如果你想要一个大的内存块。

如果你想要一个long*指针数组,然后每个数组都在一个单独的内存块中,就像这样:

long **a = malloc(100*sizeof(long*));
for (i=0; i<100; i++) {
    a[i] = malloc(100*sizeof(long));
}

这创建了1个long*指针数组,然后是每个指针的100个longs的1个数组,但是我现在不确定你是否说a[10][15]例如它是否会计算元素的位置,就好像它是一个连续的块。检查出。 :)

答案 1 :(得分:1)

您在评论中说n是行数。因此,您需要分配n行,每行m。因此,第二个for循环条件应为i < n。此外,如果无法分配内存,则应检查malloc的{​​{1}}的返回值。我建议进行以下更改 -

NULL

请注意,多维数组不是一种全新的类型。它只是一个元素数组,其中每个元素本身是一个数组(用于2D数组),一个数组数组(用于3D)数组,依此类推。如果您使用long long **a = malloc(n * sizeof(*a)); for(i = 0; i < n; i++) a[i] = malloc(m * sizeof(*a[i])); ,则可以干净利落地将阵列分配为

C99

您还应该完成此操作 - How do I work with dynamic multi-dimensional arrays in C?

答案 2 :(得分:1)

您有三个错误:第一个是您只分配5个辅助数组,但在输入中,您循环遍历6个。

第二个问题是数组索引从零开始,即索引从零开始并且变为大小减1。

第三个问题是您扫描了两个数字(为什么?),但是只提供了一个指向scanf的目标指针。

答案 3 :(得分:0)

如果你有C99使用可变长度数组

#include <stdio.h>
#include <stdlib.h>

int main(void) {
  unsigned rows, cols;
  printf("Enter rows and columns: ");
  fflush(stdout);
  scanf("%u%u", &rows, &cols);
  int (*a)[cols];                              // pointer to VLA
  a  = malloc(rows * cols * sizeof a[0][0]);
  if (a) {
    for (unsigned r = 0; r < rows; r++) {
      for (unsigned c = 0; c < cols; c++) {
        a[r][c] = r*c;
      }
    }
    printf("the element at [4, 2] is %d\n", a[4][2]);
    free(a);
  }
  return 0;
}

否则,您需要手动计算索引。

答案 4 :(得分:0)

您的代码中存在许多问题

首先,您需要long long a[100][100],但只为int s

分配足够的空间
a[i] = malloc(m * sizeof(int));

您还访问了越界的数组。索引从0开始到array_length-1。

另一个问题是你扫描了2个int值,但只提供了1的地址。

scanf("%d %d",&a[i][j]);

你可以分配一个100个元素的指针数组,每个指向另一个100个元素数组的数组,但是这样做并不好,因为它需要花费一些时间来完成100个malloc,并且最终的内存很可能不是不连续,这使得缓存不友好。还有一个小的内存开销,因为内存分配器必须将其四舍五入到最近的块大小,这很可能是2的幂,当你在第一维中分配越来越多的元素时,这可能很大。

您应该声明一个大小为100 * 100的一维数组。这将更快,并提高缓存一致性。要在a[i][j]获取元素,只需执行a[i*WIDTH + j]

long long* a = malloc(WIDTH*HEIGHT*sizeof(long long));
for (i = 0; i < WIDTH*HEIGHT; i++)
{
    scanf("%lld ",&a[i]);
}

for (i = 0; i < HEIGHT; i++)
{
    for (j = 0; j < WIDTH; j++)
    {
        printf("%lld ", a[i*WIDTH + j]);
    }
    printf("\n");
}