在C中返回一个字符串

时间:2013-02-27 16:02:19

标签: c dynamic

我正在尝试从内存中返回一个char数组,我只是得到一些随机值。我无法弄清楚出了什么问题。这是我的代码:

stack.h:

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

typedef struct {
    struct node * head;
} stack;

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;
    }
}

main.c中:

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

这会向控制台输出一些随机值。我检查并正确删除内存中的节点。如何正确返回此字符串?

1 个答案:

答案 0 :(得分:9)

该行

free(tmp);

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

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

  • pop更改为返回node*,将调用者留给free弹出的节点
  • void返回pop,在释放s之前在pop内打印tmp的值
  • pop内分配内存,将tmp->s复制到此处然后返回这个新分配的块(调用者必须释放该块)。我不推荐这个;具有在低内存中失败的堆栈弹出功能将是非常奇怪的......