设置结构指针

时间:2011-12-14 21:48:24

标签: c

我在弄清楚如何启动一个struct指针数组时遇到了问题。 我最想要做的是循环遍历struct指针数组,并为每个指针做一些工作。

结构的代码:

typedef double Align;
union header {
    struct {
        union header * p, *prev;
        unsigned size;
    } s;
    Align x;
};

typedef union header Header;

我无法开始工作的代码如下:

Header * freelist[NRQUICKLISTS]; /* Listan med  */

void init() { /* call this once in the beginning */
    int i;
    for (i = 0; i < NRQUICKLISTS-1; i++) {
        freelist[i]->s.p = freelist[i]; /* <-- this line cause Segmentation fault */
        freelist[i]->s.size = 0;
    }
    freelist[i] = &base;
    freelist[i]->s.p = freep = &base; /* cirkulär lista */
    freelist[i]->s.size = 0;
}

2 个答案:

答案 0 :(得分:1)

您需要先为指针分配内存,然后才能使用它们:

for (i = 0; i < NRQUICKLISTS-1; i++) {
    freelist[i] = new Header;
    freelist[i]->s.p = freelist[i]; /* <-- this line cause Segmentation fault */
    freelist[i]->s.size = 0;
}

另外,我建议您使用C ++方式 - 使用std:vector而不是数组。

编辑:

对于C,请使用malloc:

for (i = 0; i < NRQUICKLISTS-1; i++) {
    freelist[i] = malloc(sizeof(Header));
    freelist[i]->s.p = freelist[i]; /* <-- this line cause Segmentation fault */
    freelist[i]->s.size = 0;
}

答案 1 :(得分:0)

您需要分配每个指针:

for (i = 0; i < NRQUICKLISTS-1; i++)
{
    freelist[i] = malloc(sizeof(Header));
    freelist[i]->s.p = freelist[i];
    freelist[i]->s.size = 0;
}

或者使用连续存储:

Header freelist[NRQUICKLISTS];

for (i = 0; i < NRQUICKLISTS-1; i++)
{
    freelist[i].s.p = freelist + i;
    freelist[i].s.size = 0;
}