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

时间:2012-03-14 19:00:17

标签: c arrays pointers struct 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;
}

在第14行给出invalid initializer错误。我要做的是获取结构指针数组的副本,这些结构指针位于不同的结构中。

2 个答案:

答案 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[])

您没有使用argcargv,因此您最好使用以下替代声明:

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或仅复制结构,副本没有简短的解决方案。