数组上的链表分配器

时间:2012-06-25 01:31:55

标签: c pointers

很抱歉,如果只是我正在摸着头看这段代码,但有人可以解释这个链表是如何存储的?

特别是我对这个操作*((Particle**)p) = (p++)+1;感到困惑 - 如何解释左侧指针的操作?

#include <stdio.h>

typedef struct Particle_s {
    int myint;
    char test_string[10];
} Particle;

#define maxParticles 10

static Particle particleBuf[maxParticles]; // global static array
static Particle* headParticle;

void initParticleAllocator()
{
    Particle* p = particleBuf;
    Particle* pEnd = particleBuf+maxParticles-1;
    // create a linked list of unallocated Particles
    while (p!=pEnd) 
        *((Particle**)p) = (p++)+1;

    *((Particle**)p) = NULL; // terminate the end of the list

    headParticle = particleBuf; // point 'head' at the 1st unalloc'ed one
}

Particle* ParticleAlloc()
{
    // grab the next unalloc'ed Particle from the list
    Particle* ret = headParticle;
    if (ret)
        headParticle = *(Particle**)ret;
    return ret; // will return NULL if no more available
}

void ParticleFree(Particle* p)
{
    // return p to the list of unalloc'ed Particles
    *((Particle**)p) = headParticle;
    headParticle = p;
}

int main(int argc, char **argv)
{
    int i;

    initParticleAllocator();

    for( i=0; i<maxParticles; i++) {
        Particle* newparticle = ParticleAlloc();
        printf("test cell %d (0x%x - 0x%x)\n", i, &particleBuf[i], newparticle);
    }

    getc(stdin);
    return 0;
}

1 个答案:

答案 0 :(得分:1)

这段代码完成的操作是:数组'particleBuf'的每个成员都被初始化为数组的下一个成员的地址 - 直到最后一个元素,它被初始化为null。

这样,每当你需要在链接列表中添加一个新成员时,你可以通过读取一个数组元素获取下一个要放入它的粒子,然后更新headParticle指向数组的下一个成员