在malloc-ed实体内存块中使用标准数组索引

时间:2015-03-30 23:05:14

标签: c arrays pointers malloc

我在C中有以下程序。我使用malloc为2048x2048的float数组分配空间。我有指向这个数组的指针,我想索引数组索引,如表[1] [2]。

我知道我可以像这样使用malloc:

float ** table;
table = (float **) malloc(2048*sizeof(float*));
for(i=0;i<2048;i++)
    table[i]=(float *) malloc(2048*sizeof(float));
//now table[1][2] works just perfect

但我更喜欢malloc一块坚固的内存,这就是我使用包含所需表格的结构的原因。

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

struct ftable
{
    float table[2048][2048];
};

typedef struct ftable ftable;

int main(void)
{
    ftable * A_table;
    A_table = (ftable *)malloc(sizeof(ftable));
    if (!A_table)
    {
        puts("Error allocating memory...");
        exit(1);
    }

    float * A;
    A = (float *)A_table;

    float ** B;
    B = (float **)A_table;

    //I want to access A[1][2]
    //------------   1st way  -------------- works ok
    A[1 * 10 + 2] = 5.0;
    //or
    *(A + 12) = 5.0;

    //------------   2nd way  -------------- doesn't work
    B[1][2] = 5.0;

    //finish
    free(A_table);
    getchar();
    return 0;
}

我想用这种方式索引数组:A [i] [j]而不是A [i * columns + j],因为后来我将使用openmp来优化一些for循环和普通数组索引是必须的。我被困在这里,我需要你的帮助。

2 个答案:

答案 0 :(得分:2)

这样做的结构方法很好,但你必须访问数组成员:

A = malloc(sizeof ftable);

A.table[3][4] = . . .

答案 1 :(得分:0)

如果您实际上根本不想使用结构(如评论中所示),您可以写:

float (*table)[COLUMNS] = malloc( ROWS * sizeof *table );

然后使用table[row][col]访问每个单元格。

如果您不熟悉malloc(N * sizeof *p)模式,请

See here