gpt4 book ai didi

c - 从C中的堆栈中删除后数据仍在内存中

转载 作者:太空宇宙 更新时间:2023-11-04 00:51:03 24 4
gpt4 key购买 nike

我正在努力提高我对 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;
}

最佳答案

您在 pop() 函数中使用了 strcat()。这会将位于 stack->head 的字符串附加到您的 char path[]。如果要替换字符串,请使用 strcpy() 而不是 strcat()

除此之外,您的代码中还有其他奇怪之处。您正在从 push() 返回一个 int 并从 pop() 返回一个 char* 但您不是将这些变量分配给 main() 中的任何内容,那么为什么它们不是 void 函数?

关于c - 从C中的堆栈中删除后数据仍在内存中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18651822/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com