作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我创建了一个二维数组,内容如下
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);
}
//我为这个数组中的所有元素分配了一个值 0,如下所示
for(i=0;i<(lx+2)*(ly+2);i++)
{
a[i]=0;
}
//我在下面打印出我所有的元素
for(i=0;i<(lx+2)*(ly+2);i++)
{
printf("position %d values %d\n",i,a[i]);
}
//当我看到输出时,它向我显示了一个特定位置 13 的垃圾值。我无法弄清楚.. 另外请告诉我如何访问行和列,例如访问第 7 列行0 和第 5 行第 6 列的 lx,ly 如我的代码所示
最佳答案
您的方法绝对是朝着正确的总体方向前进。
我认为:
a=(double**) malloc((lx+2)*sizeof(double));
通常是:
a = malloc(lx * sizeof(double *));
然后在没有连续性要求的情况下,这个:
a[0]= (double*) malloc((lx+2)*(ly+2)* sizeof(double));
在大多数程序中看起来像:
a[0] = malloc(ly * sizeof(double));
最后,最后一行需要在一个循环中,为每个 a[i]
分配它自己的 malloc 空间。
但是,这不会创建连续的内存。为此,您需要进行大量分配,然后将其划分为行 vector 。所以,而不是循环中的第二个 malloc,可能是这样的:
double *t = malloc(lx * ly * sizeof(double));
for (i = 0; i < lx; ++i)
a[i] = t + i * ly;
综合起来:
#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
关于c - 如何分配具有连续内存的二维数组?我如何使用它来访问行和列?举个例子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2259773/
我是一名优秀的程序员,十分优秀!