我正在尝试从内存中返回一个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);
这会向控制台输出一些随机值。我检查并正确删除内存中的节点。如何正确返回此字符串?
答案 0 :(得分:9)
该行
free(tmp);
释放包含您返回的字符串的内存。 (一旦释放,内存可能在任何时候都被重用。在某些情况下,你的进程也可能无法读取。大概你看到了一个“随机值”,因为你正在运行一个调试版本,堆管理器立即设置释放记忆到不同的值。)
有几种方法可以解决这个问题,包括
pop
更改为返回node*
,将调用者留给free
弹出的节点void
返回pop
,在释放s
之前在pop
内打印tmp
的值pop
内分配内存,将tmp->s
复制到此处然后返回这个新分配的块(调用者必须释放该块)。我不推荐这个;具有在低内存中失败的堆栈弹出功能将是非常奇怪的......