1

我试图char从内存中返回一个数组,我只是得到一些随机值。我不知道出了什么问题。这是我的代码:

堆栈.h:

struct node{
    char s[MAX_STRING_SIZE];
    struct node * next;
};

typedef struct {
    struct node * head;
} stack;

堆栈.c:

char * pop(stack * my_stack){
    if (my_stack->head == NULL){
        printf("Stack is empty.");
        exit(0);
    } else {
        struct node * tmp = my_stack->head;
        char * s = tmp->s;

        my_stack->head = my_stack->head->next;

        free(tmp);

        return s;
    }
}

主.c:

char * s2 = pop(&my_stack);
printf("%s\n", s2);

这只会将一些随机值打印到控制台。我检查并弹出正确地从内存中删除节点。如何正确返回此字符串?

4

1 回答 1

9

线

free(tmp);

释放包含您返回的字符串的内存。(一旦被释放,内存可以在任何时候重用。在某些情况下,它也可能变得无法从您的进程中读取。大概您看到的是“随机值”,因为您正在运行一个调试构建,其中堆管理器立即设置释放内存到不同的值。)

有几种方法可以解决此问题,包括

  • 更改pop为 return node*,将调用者留给free弹出的节点
  • return void from pop, printing the value of s inside pop before tmp is freed
  • allocate memory inside pop, copying tmp->s into this then returning this newly allocated block (which the caller would have to free). I don't recommend this; having a stack popping function which fails in low memory would be very odd...
于 2013-02-27T16:03:45.130 回答