在C中结构化到二维结构指针赋值

时间:2010-12-24 01:04:00

标签: c pointers struct

我想得到这个代码的工作,我用Google搜索并在efnet和freenode中询问,但我找不到答案。

我想要的是将结构woot分配给另一个二维结构woot *,我需要malloc来做到这一点。

然后,我如何在那里使用malloc以及如何分配结构?感谢。

#include <stdio.h>
struct omg {
    int foo;
};
struct woot {
    struct omg *localfoo;
    int foo;
};
int a = sizeof(struct woot);
int main(void){
    struct woot *what[10][10] = (struct woot *) malloc(100*a);
    struct omg hahaha[100];
    hahaha[1].foo = 15;
    what[1][6].localfoo = &hahaha[1];
}

2 个答案:

答案 0 :(得分:0)

struct woot *what[10][10] = (struct woot *) malloc(100*a);

我很好奇,这段代码甚至可以编译吗? (编辑:不,它没有。)无论如何:

  1. 你真的不需要malloc(),声明struct woot *what[10][10];就足够了。
  2. C (并认为是错误的表单)中不需要调用malloc()时返回的void *指针。
  3. (不是真的答案,我知道......我会把它作为一个简单的评论发布,但我还没有足够的分数。)

    编辑哎呀,其他人在我写这篇文章的同时指出了相同的内容。

    新修改:这是一个更好的代码版本,更正了一些错误:

    #include <stdio.h>
    #include <stdlib.h> // needed for malloc()
    
    struct omg {
        int foo;
    };
    
    struct woot {
        struct omg *localfoo;
        int foo;
    };
    
    int main(void){
        const int a = sizeof(struct woot); /* there is no reason "a" should be global...
                                              actually, "a" is not needed at all, and, even if it
                                              were needed, it should be declared as "const" :) */
        struct woot *what[10][10];
        struct omg hahaha[100];
        hahaha[1].foo = 15;
        what[1][6]->localfoo = &hahaha[1];
        what[7][2] = malloc(a); // I would write "malloc(sizeof(struct woot))"
    
        return 0;   // main() should return an int, as declared!
    }
    

答案 1 :(得分:0)

您正在尝试使用标量值(malloc返回的指针)初始化数组。如果你真的想要一个10×10的结构指针矩阵(而不是10×10矩阵的结构),你不需要malloc:

//Statically allocated 10x10 matrix of pointers, no need for malloc.
struct woot *what[10][10];

指定指向该矩阵中单元格的指针:

struct woot oneSpecificWoot;
what[1][2] = &oneSpecificWoot;

如果确实如此,真的你想要什么,那么你可以动态地创建一堆woot来填充它。像这样:

int i, j;
for(i=0; i<10; i++) {
    for(j=0; j<10; j++) {
        what[i][j] = malloc(sizeof(struct woot));
        //Of course, you should always test the return value of malloc to make sure
        // it's not NULL.
    }
 }

但如果你要这样做,你也可以自己静态地分配woot

//A 10x10 matrix of woots, no malloc required.
struct woot what[10][10];

如果在其他地方创建woot,第一种情况(指针的二维数组)会更有可能,你只想在网格中引用它们,或者如果你不知道编译时网格的尺寸。但是在你的代码中,你使用malloc来创建固定数量的它们,所以你也可以让编译器静态地分配它们。