返回C中的字符串
我试图从内存中返回一个返回C中的字符串,c,dynamic,C,Dynamic,我试图从内存中返回一个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){ pr
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);
这只是将一些随机值打印到控制台。我检查并弹出从内存中正确删除节点。如何正确返回此字符串?行
free(tmp);
释放包含返回字符串的内存。(一旦释放,内存可以在任何时候重用。在某些情况下,它也可能无法从进程中读取。您可能看到一个“随机值”,因为您正在运行调试生成,堆管理器会立即将释放的内存设置为不同的值。)
有几种方法可以解决此问题,包括
- 更改
以返回pop
,将调用者留在node*
空闲的
弹出的节点
- 从
返回pop
,在void
被释放之前,在tmp
内部打印pop
的值s
- 在
中分配内存,将pop
复制到该内存中,然后返回新分配的块(调用者必须释放该块)。我不建议这样做;有一个堆栈弹出功能,在内存不足时会失败,这将是非常奇怪的tmp->s
- 线路
free(tmp);
释放包含返回字符串的内存。(一旦释放,内存可以在任何时候重用。在某些情况下,它也可能无法从进程中读取。您可能看到一个“随机值”,因为您正在运行调试生成,堆管理器会立即将释放的内存设置为不同的值。)
有几种方法可以解决此问题,包括
- 更改
以返回pop
,将调用者留在node*
空闲的
弹出的节点
- 从
返回pop
,在void
被释放之前,在tmp
内部打印pop
的值s
- 在
中分配内存,将pop
复制到该内存中,然后返回新分配的块(调用者必须释放该块)。我不建议这样做;有一个堆栈弹出功能,在内存不足时会失败,这将是非常奇怪的tmp->s
节点将其内存返回给系统,以便调用空闲(tmp)
进行潜在的重用。在这一点之后,存储器的内容可能立即改变,也可能长时间保持不变。唯一可以遵循的安全规则是,内存不再属于您,因此您不能尝试读取它。如果这没有帮助,你能试着重新说明哪些区域不清楚吗?我在函数中为一个字符串分配了空间,并将head->s复制到这个字符串,然后返回了它。它起作用了,但是我想知道每次我弹出一个元素时我分配的所有内存会发生什么?我不确定我是否理解这个问题。弹出的节点将其内存返回给系统,以便调用空闲(tmp)
进行潜在的重用。在这一点之后,存储器的内容可能立即改变,也可能长时间保持不变。唯一可以遵循的安全规则是,内存不再属于您,因此您不能尝试读取它。如果这没有帮助,你能试着重新说明哪些区域不清楚吗?