c - 用C实现 "strings"的堆栈

标签 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”)。当我想弹出堆栈时,弹出的值为空。不为空,而是空字符串或其他什么?

我不知道我做错了什么,但显然某处似乎有错误。

萨米

最佳答案

在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);
  }
}

从这里开始,您可能还需要对调用程序进行一些其他更改。

此外,当您释放它时,释放单个资源并不会释放您分配的所有内存。

关于c - 用C实现 "strings"的堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9539048/

相关文章:

c - C中未初始化的局部变量中包含的值到底是什么?

Java栈队列获取可查看前台人数

c++ - C++ 项目中的第三方 C 文件的 CMakeLists.txt

c++ - 编译器警告和错误是如何定义的,它们是否包含在标准中

c - 在另一个文件中搜索一个文件的一部分

c - C 程序中的堆栈。弹出操作不起作用

c - 堆栈问题: Local variables vs Arithmetics

java - 是否有为 Delphi (Win32) DLL 创建 C 头文件的工具?

c - 如何在c中创建动态大小的数组?

c++ - c2955 错误 - 使用类模板需要参数列表