C malloc二维结构数组(带行和列)

时间:2015-08-23 21:36:56

标签: c arrays struct malloc

我有一段这样的代码,我想为两个dimmensional struct array分配内存。

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

struct complex
{
    int re;
    int im;
};

int main ()
{
    int r = 5; //rows
    int c = 6; //cols

    struct complex (*wsk)[c];
    wsk = (struct complex(*)[c])malloc(sizeof(struct complex)*r*c);

    /* ... */
}

我不确定malloc()部分,是否正确?

2 个答案:

答案 0 :(得分:0)

这是一种常见的方法。当所有行具有相同的列数时,我发现这是最好的,所以在大多数情况下。原因:

  • malloc很慢。尽量少用malloc - s
  • 您始终需要free wskwsk[0]。当您更改rc运行时间时,这非常棒:您不必存储旧值以释放正确的行数。

另外,不要忘记检查malloc是否返回NULL

struct complex ** wsk = (struct complex **) malloc(r *  sizeof(struct complex*));
wsk[0] = (struct complex *) malloc(r * c * sizeof(struct complex));
int i;
for(i = 1; i < r; ++i)
    wsk[i] = wsk[0] + i * c;

哦,为什么你没有输入结构?

typedef struct complex complex;

甚至更简单,在声明中:

typedef struct /*complex*/ {
    ...
} complex;

然后,您不必一直写struct complex,只需complex

答案 1 :(得分:-1)

很高兴看到有人知道如何定义指向数组的e指针以动态分配“真实的”多维数组(int (*)[]...[])。通常每个人都会为数组分配指针数组......(即int *[])。

但是在尺寸调整方面存在错误。如果您的范围是创建一个包含5行和6列复杂结构的数组,则代码必须是:

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

struct complex
{
    int re;
    int im;
};

int main(int argc, char *argv[])
{
    int r = 5; //rows
    int c = 6; //cols

    struct complex (*wsk)[r][c];

    wsk = malloc(sizeof(struct complex)*r*c);

    for (int i=0; i<r; i++)
        for(int j=0; j<c; j++)
        {
            (*wsk)[i][j].re =     10*i + j;
            (*wsk)[i][j].im = -1*(10*i + j);
        }

    for (int i=0; i<r; i++)
    {
        for(int j=0; j<c; j++)
            printf("r=%+2.2d i=%+2.2d  ", (*wsk)[i][j].re, (*wsk)[i][j].im);
        printf("\n");
    }

    return 0;
}

输出结果为:

r=+00 i=+00  r=+01 i=-01  r=+02 i=-02  r=+03 i=-03  r=+04 i=-04  r=+05 i=-05
r=+10 i=-10  r=+11 i=-11  r=+12 i=-12  r=+13 i=-13  r=+14 i=-14  r=+15 i=-15
r=+20 i=-20  r=+21 i=-21  r=+22 i=-22  r=+23 i=-23  r=+24 i=-24  r=+25 i=-25
r=+30 i=-30  r=+31 i=-31  r=+32 i=-32  r=+33 i=-33  r=+34 i=-34  r=+35 i=-35
r=+40 i=-40  r=+41 i=-41  r=+42 i=-42  r=+43 i=-43  r=+44 i=-44  r=+45 i=-45