我有一段这样的代码,我想为二维结构体数组分配内存。
#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()
部分是否正确?
这是一种常见的方法。我发现在大多数情况下,当所有行的列数相同时,这是最好的。原因:
-
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
就可以了。
这些语句有一个错别字
struct complex (*wsk)[k];
^^^
wsk = (struct complex(*)[k])malloc(sizeof(struct complex)*r*c);
^^
我想你是指
struct complex (*wsk)[c];
^^^
wsk = (struct complex(*)[c])malloc(sizeof(struct complex)*r*c);
^^
如果是,则只要编译器支持可变长度数组,则此代码是正确的。
int main (){
int r = 5; //rows
int c = 6; //cols
struct complex (*wsk)[c];
wsk = (struct complex(*)[c])malloc(sizeof(struct complex)*r*c);
...
}
否则你应该把c
定义为预处理器常量
#define c 6
或者应该动态分配一个一维指针数组,数组的每个元素依次应该是动态分配的给定类型的一维对象数组的地址。
请注意,如果main没有参数,那么根据C标准,它必须声明为
int main( void )
很高兴看到有人知道如何定义一个指向数组的指针来动态地分配一个'真正的'多维数组(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