C语言中的结构指针数组,初始化程序错误无效

yas*_*sar 4 c arrays struct pointers initialization

这段代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

invalid initializer在第14行给出了错误.我想要做的是获取结构指针数组的副本,它们位于不同的结构中.

Jon*_*ler 5

哎哟; 这里有很多问题.

extern void *malloc(unsigned int);
Run Code Online (Sandbox Code Playgroud)

不要那样做; 使用,#include <stdlib.h>因为这将是正确的,你写的内容通常是不正确的(参数malloc()是a size_t,不一定是unsigned int;它可能是unsigned long,或其他类型).

struct Box {
    int x, y ,w, h;
};
Run Code Online (Sandbox Code Playgroud)

除了飘忽不定的空间,struct Box还可以.

struct Wall {
    char color[15];
    struct Box *boxes[20];
};
Run Code Online (Sandbox Code Playgroud)

struct Wall就OK了.

int main(int argc, const char *argv[])
Run Code Online (Sandbox Code Playgroud)

你没有使用argcargv,所以你最好使用替代声明:

int main(void)
Run Code Online (Sandbox Code Playgroud)

原始代码:

{
    struct Wall *mywall = malloc(sizeof(struct Wall));
Run Code Online (Sandbox Code Playgroud)

这会分配但不会初始化单个struct Wall.就其本身而言,虽然您应该在使用之前检查分配是否成功.您还需要担心分配struct Box数组元素指向的项目.

    struct Box *myboxes[] = mywall->boxes;
Run Code Online (Sandbox Code Playgroud)

你手边有一场小小的灾难.你无法复制那样的数组.你没有检查过你有一个阵列.忽略错误检查,你会遇到以下问题之一:

    struct Box *myboxes[] = { &mywall->boxes[0], &mywall->boxes[1], ... };
Run Code Online (Sandbox Code Playgroud)

要么:

    struct Box **myboxes = &mywall->boxes;
Run Code Online (Sandbox Code Playgroud)

我不相信你想要第二个版本,因为它更短.

    return 0;
Run Code Online (Sandbox Code Playgroud)

我喜欢return 0;在最后看到main(),即使C99允许你省略它.

}
Run Code Online (Sandbox Code Playgroud)