我正在尝试在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')。当我想弹出堆栈时,弹出的值为空。不是空,而是一个空字符串或什么?
我不知道我做错了什么,但显然在某处出现了错误。
森美
答案 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会浪费空间并且还会造成内存泄漏。