此代码:
extern void *malloc(unsigned int);
struct Box {
int x, y ,w, h;
};
struct Wall {
char color[15];
struct Box *boxes[20];
};
int main(int argc, const char *argv[])
{
struct Wall *mywall = malloc(sizeof(struct Wall));
struct Box *myboxes[] = mywall->boxes;
return 0;
}
在第14行给出invalid initializer
错误。我要做的是获取结构指针数组的副本,这些结构指针位于不同的结构中。
答案 0 :(得分:5)
哎哟;这里有很多问题。
extern void *malloc(unsigned int);
不要那样做;使用#include <stdlib.h>
因为这是正确的,你写的内容通常是不正确的(malloc()
的参数是size_t
,不一定是unsigned int
;它可能是unsigned long
{1}},或其他类型)。
struct Box {
int x, y ,w, h;
};
除了不稳定的空间外,struct Box
还可以。
struct Wall {
char color[15];
struct Box *boxes[20];
};
struct Wall
也可以。
int main(int argc, const char *argv[])
您没有使用argc
或argv
,因此您最好使用以下替代声明:
int main(void)
原始代码:
{
struct Wall *mywall = malloc(sizeof(struct Wall));
这会分配但不会初始化单个struct Wall
。就其本身而言,虽然您应该在使用之前检查分配是否成功。您还需要担心分配数组元素指向的struct Box
项。
struct Box *myboxes[] = mywall->boxes;
你手边有一场小小的灾难。你无法复制那样的数组。你没有检查过你有一个阵列。忽略错误检查,你会遇到以下其中一个:
struct Box *myboxes[] = { &mywall->boxes[0], &mywall->boxes[1], ... };
或:
struct Box **myboxes = &mywall->boxes;
我不相信你想要第二个版本,因为它更短。
return 0;
我希望在return 0;
的末尾看到main()
,即使C99允许您省略它。
}
答案 1 :(得分:0)
怎么样:
struct Box **myboxes = mywall->boxes;
然后你可以做类似的事情:
for ( int i = 0 ; i < 15 ; i++ )
mywall->boxes[i] = malloc(sizeof(Box));
Box* x = myboxes[1];
由于代码现在,mywall->boxes
尚未初始化。
注意:只需重新阅读问题 - 这不会返回数组的副本,但指向同一位置。没有使用memcpy
或仅复制结构,副本没有简短的解决方案。