我正在尝试用 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/