2013-09-06 3 views
1

Я пытаюсь улучшить свои знания 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; 
} 
+6

Кстати, 'if ((* stack) .size == 0)' работает просто отлично, но 99.8% программистов C будут писать его как 'if (stack-> size == 0)', '' -> '- это ожидаемый синтаксис. – unwind

ответ

3

Вы используете strcat() в своей функции pop(). Это добавляет строку, которая находится на stack->head, на ваш char path[]. Если вы хотите заменить строку, используйте strcpy(), а не strcat().

Кроме того, в вашем коде есть и другие странности. Вы возвращаете int от push() и char* от pop(), но вы не назначаете эти переменные ни в чем в main(), так почему же они не void функции?

3

malloc() не заполняет выделенную память нулями, поэтому здесь

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

вы добавить данную строку к тому, что случается в (*p).curPath. (Это может привести к нарушению сегментации.)

Использование strcpy() или (возможно, лучше strlcpy()) должно решить проблему.

Смежные вопросы