我在弄清楚如何启动一个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;
}
答案 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;
}