在C中实现一堆“字符串”

时间:2012-03-02 19:16:12

标签: c stack

我正在尝试在C中实现堆栈结构,用于将char数组存储到。

我有以下代码:

typedef struct {
  size_t size;
  char **data;
} loods1;

loods1 *init(void) {
  loods1 *loods = malloc(sizeof(loods1));
  loods->data = malloc(sizeof(char *) * STACK_MAX);
  for (int i = 0; i < STACK_MAX; i++) {
    *(loods->data + i) = malloc(LABEL_LENGTH_MAX * sizeof(char));
  }   
  loods->size = 0;
  if (loods == NULL) {
    perror("malloc failed\n");
    return NULL;
  }
  return loods;
}

int empty(loods1 *loods) {
  return (loods->size == 0);
}
void push(loods1 *loods, char *name) {
  if (loods->size == STACK_MAX) {
    perror("Stack is full\n");
    exit(0);
  }
  else {
    *((loods->data) + loods->size++) = name;
  }
}
char *pop(loods1 *loods) {
  if (loods->size == 0) {
    printf("size == 0\n");
    return NULL;
  }
  else {
    printf("%s \n", *(loods->data + 1));
    return *(loods->data + (--loods->size));
  }
}
int delete(loods1 *loods) {
  for (int i = 0; i < STACK_MAX; i++) {
    free(*(loods->data + i));
  }   
  free(loods->data);
  free(loods);   
}

有两个问题:首先,每次我向堆栈添加一个新元素时,它会覆盖所有现有元素(如果添加'3'和'11',我想添加'15',新堆栈将看起来像'15','15','15')。当我想弹出堆栈时,弹出的值为空。不是空,而是一个空字符串或什么?

我不知道我做错了什么,但显然在某处出现了错误。

森美

2 个答案:

答案 0 :(得分:2)

在push函数中,如果传递char *,它会将指针转移到char *所在的位置,当你执行p ++时,它将从你传递的char *开始。

尝试将更改推送定义设为:

void push(loods1 *loods, const char *name) {
  if (loods->size == STACK_MAX) {
    perror("Stack is full\n");
    exit(0);
  }
  else {
    strcpy((loods->data)[loods->size++], name);
  }
}

从这里你可能还需要对你的通话程序进行一些其他更改。

此外,当你释放它时,释放单个loods并不释放你分配的所有内存。

答案 1 :(得分:1)

我浏览了代码,似乎没问题,我认为问题出在您的客户端。

你在堆栈中唯一的商店指针,你可能在堆栈上推送相同的指针,但重写它指向的字符串。

请注意,如果您真的只想存储指针,那么您的第3个malloc会浪费空间并且还会造成内存泄漏。