如何分配具有连续内存的二维数组?我如何使用它来访问行和列?给我一个例子

sri*_*dan 3 c arrays dynamic-allocation

我创建了一个二维数组,其内容如下

     int i,j,lx,ly;// lx,ly are the row and column respectively
     double** a;

     a=(double**) malloc((lx+2)*sizeof(double));

     a[0]= (double*) malloc((lx+2)*(ly+2)* sizeof(double));

     assert(a[0]); 

     for(i=1;i<lx+2;i++)
     {
       a[i]=a[i-1]+i*(ly+2);
     }
Run Code Online (Sandbox Code Playgroud)

// 我为这个数组中的所有元素分配了一个值 0,如下所示

    for(i=0;i<(lx+2)*(ly+2);i++)
    {
      a[i]=0;
    } 
Run Code Online (Sandbox Code Playgroud)

// 我打印出下面的所有元素

      for(i=0;i<(lx+2)*(ly+2);i++)
      {
         printf("position %d values %d\n",i,a[i]);
      } 
Run Code Online (Sandbox Code Playgroud)

// 当我看到输出时,它向我显示了一个特定位置 13 处的垃圾值。我无法弄清楚。还请告诉我如何访问行和列,如 Eg 以访问第 7 列第 0 行和第 5 行就 lx 而言,第 6 列列,如我的代码所示

Dig*_*oss 5

您的方法肯定朝着正确的方向发展。

我认为这:

a=(double**) malloc((lx+2)*sizeof(double));
Run Code Online (Sandbox Code Playgroud)

通常是:

a = malloc(lx * sizeof(double *));
Run Code Online (Sandbox Code Playgroud)

然后没有连续性要求,这个:

a[0]= (double*) malloc((lx+2)*(ly+2)* sizeof(double));
Run Code Online (Sandbox Code Playgroud)

在大多数程序中看起来像:

a[0] = malloc(ly * sizeof(double));
Run Code Online (Sandbox Code Playgroud)

最后,最后一行需要在一个循环中,为每个循环分配a[i]自己的 malloc 空间。

但是,这不会创建连续的内存。为此,您需要进行大分配,然后将其划分为行向量。因此,而不是循环中的第二个 malloc,可能类似于:

double *t = malloc(lx * ly * sizeof(double));
for (i = 0; i < lx; ++i)
    a[i] = t + i * ly;
Run Code Online (Sandbox Code Playgroud)

把它们放在一起:

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

void arrayDemo(int lx, int ly)
{
  double **a;
  int i, j;

  a = malloc(lx * sizeof(double *));
  double *t = malloc(lx * ly * sizeof(double));
  for(i = 0; i < lx; ++i)
    a[i] = t + i * ly;

  for(i = 0; i < lx; ++i)
    for(j = 0; j < ly; ++j)
      a[i][j] = i*100 + j;
  for(i = 0; i < lx; ++i) {
    for(j = 0; j < ly; ++j)
      printf(" %4.0f", a[i][j]);
    printf("\n");
  }
}

int main(int ac, char **av)
{
  arrayDemo(atoi(av[1]), atoi(av[2]));
  return 0;
}

$ cc -Wall all.c
$ ./a.out 4 7
    0    1    2    3    4    5    6
  100  101  102  103  104  105  106
  200  201  202  203  204  205  206
  300  301  302  303  304  305  306
Run Code Online (Sandbox Code Playgroud)