struct with char ** val

时间:2017-04-11 16:11:15

标签: c pointers stack

我正在实现一种使用以下结构作为节点

的存储桶堆栈
struct NodeBucket {
    char** val;
    struct NodeBucket* next;
};

它应该工作的方式是每个存储桶可以保存指定数量的值,当创建一个新的NodeBucket并链接到之前然后填充等等。 在尝试向第一个存储桶添加第二个值时,我遇到了困惑。当我添加第一个值时,我创建第一个存储桶,使用temp->value = &val将值设置为输入。现在我不确定如何添加其余的输入。我尝试过使用索引(firstBucket-> val [1] = val),但这似乎不是正确的方法。我将不胜感激任何帮助。是的,这是家庭作业,我是C的相对初学者,来自Python。

修改

void push(char* val, struct Stack *stack){
    if (isEmpty(stack)){
            struct NodeBucket *temp =malloc(sizeof(struct NodeBucket));
            temp ->val = &val;
            temp->next = NULL;
            stack->firstBucket=temp;
            stack->topElt++;
    }else if(!isEmpty(stack)&& size(stack)!=stack->bucketSize){
            stack->firstBucket->val[stack->topElt] = val;
            stack->topElt++;
    }

1 个答案:

答案 0 :(得分:0)

  

它应该起作用的方式是每个桶可以容纳指定数量的值,

因此,您的存储区必须具有足够的stack->bucketSize值存储空间,值为字符串,因此类型为char*。你没有这样做,实际上你正在有效地创建一个指向char*的指针,并为它分配val堆栈上的地址,该地址将在函数返回时消失。

struct NodeBucket需要知道它存储了多少项。

struct NodeBucket {
    size_t numValues;
    struct NodeBucket* next;
    char** val;
};

此外,您还需要为val数组分配空间。像这样初始化:

struct NodeBucket* temp = malloc(sizeof *temp);
temp->val = malloc(sizeof(char*) * stack->bucketSize);
temp->numValues = 0;
temp->next = NULL;

以相反的顺序释放所有内容。

请注意,我将val放在最后,因为您可以利用flexible array member feature将malloc(和释放)减少为一个。

然后,要添加新字符串,您会看到numValues是否小于stack->bucketSize。如果是,则将字符串添加到数组的末尾(stack->firstBucket->val[numValues] = val)并增加numValues。如果没有,则创建一个新的NodeBucket并将其添加到那里。