【问题标题】:Array of struct pointers, invalid initializer error, in CC中的结构指针数组,无效的初始化错误
【发布时间】:2012-03-31 07:00:33
【问题描述】:

这段代码:

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 错误。我想要做的是获取结构指针数组的副本,这些指针位于不同的结构中。

【问题讨论】:

  • 您不能在 C 中复制或分配数组。(但是,您可以将它们包装到一个结构中,可以被分配。)
  • 为什么不用#include <stdlib.h> 而不是extern void *malloc(unsigned int);
  • @glglgl 没有特别的原因。我写这段代码只是为了证明我的观点。我忘了malloc在哪里,懒得找了。

标签: c arrays pointers struct initialization


【解决方案1】:

哎哟;这里有很多问题。

extern void *malloc(unsigned int);

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

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;

我喜欢在main() 的末尾看到return 0;,尽管C99 允许你省略它。

}

【讨论】:

    【解决方案2】:

    怎么样:

    struct Box **myboxes = mywall->boxes;
    

    ?

    然后您可以执行以下操作:

     for ( int i = 0 ; i < 15 ; i++ )
        mywall->boxes[i] = malloc(sizeof(Box));
     Box* x = myboxes[1];
    

    就像现在的代码一样,mywall-&gt;boxes 没有初始化。

    注意:只需重新阅读问题 - 这不会返回数组的副本,而是指向相同的位置。如果不使用memcpy 或仅复制结构,则没有简短的复制解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-03
      • 2012-02-08
      • 1970-01-01
      相关资源
      最近更新 更多