1

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

2 回答 2

3

malloc()不会用零填充分配的内存,所以在这里

struct path *p = (struct path*)malloc(sizeof(struct path));
// ...
strcat((*p).curPath, path);

您将给定的字符串附加(*p).curPath到. (这可能很容易导致分段违规。)

使用strcpy()or (也许更好strlcpy())应该可以解决问题。

于 2013-09-06T07:11:57.647 回答
3

您正在使用strcat()您的pop()功能。这会将 at 的字符串附加stack->head到您的char path[]. 如果要替换字符串,请使用strcpy()而不是strcat().

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

于 2013-09-06T07:13:15.890 回答