Я пытаюсь улучшить свои знания C. C.данные остаются в памяти после удаления из стека в C
В качестве упражнения я написал структуру данных стека. Все работает нормально, если я нажимаю N элементов, а затем выталкиваю N элементов. Проблема возникает, когда я пытаюсь нажать элемент снова, поскольку последний удаленный элемент все еще находится в памяти (я думаю, что это проблема).
Когда я выделяю память для новой структуры пути, последняя удаленная строка по-прежнему находится по адресу, который был освобожден после появления данных. Итак, когда новая строка нажата, соединяется последняя удаленная и новая строка.
Может кто-нибудь, пожалуйста, проверьте следующий код и скажите мне, что я делаю неправильно. Другие комментарии также приветствуются. Благодарю.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 1000
struct path {
char curPath[N];
struct path *Next;
};
struct MyStack {
struct path *head;
int size;
};
int push(struct MyStack *, char *);
char * pop(struct MyStack *, char *);
int main() {
char path[N];
struct MyStack stack;
stack.head = NULL;
stack.size = 0;
push(&stack, "aaaaaaaaaaaa");
push(&stack, "bbbbbbbbbbbb");
pop(&stack, path);
printf("%s\n", path);
// output is:
// bbbbbbbbbbbb
path[0] = '\0';
push(&stack, "cccccccccccc");
pop(&stack, path);
printf("%s\n", path);
// output should be:
// cccccccccccc
// but it is not
// it is:
// bbbbbbbbbbbbcccccccccccc
return 0;
}
int push(struct MyStack *stack, char *path) {
if (strlen(path) > N) {
return -1;
}
struct path *p = (struct path*)malloc(sizeof(struct path));
if (p == NULL) {
return -1;
}
strcat((*p).curPath, path);
(*p).Next = (*stack).head;
(*stack).head = p;
(*stack).size++;
return 0;
}
char * pop(struct MyStack *stack, char *path) {
if ((*stack).size == 0) {
printf("can't pop from empty stack");
return NULL;
}
struct path *p;
p = (*stack).head;
(*stack).head = (*p).Next;
strcat(path, (*p).curPath);
free(p);
p = NULL;
(*stack).size--;
return path;
}
Кстати, 'if ((* stack) .size == 0)' работает просто отлично, но 99.8% программистов C будут писать его как 'if (stack-> size == 0)', '' -> '- это ожидаемый синтаксис. – unwind