我有一段这样的代码,我想为两个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()
部分,是否正确?
答案 0 :(得分:0)
这是一种常见的方法。当所有行具有相同的列数时,我发现这是最好的,所以在大多数情况下。原因:
malloc
很慢。尽量少用malloc
- s free
wsk
和wsk[0]
。当您更改r
和c
运行时间时,这非常棒:您不必存储旧值以释放正确的行数。另外,不要忘记检查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