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 に答える