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