返回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
        复制到该内存中,然后返回新分配的块(调用者必须释放该块)。我不建议这样做;有一个堆栈弹出功能,在内存不足时会失败,这将是非常奇怪的

      我在函数中为字符串分配了空间,并将head->s复制到此字符串,然后返回它。它起作用了,但是我想知道每次我弹出一个元素时我分配的所有内存会发生什么?我不确定我是否理解这个问题。弹出的
      节点将其内存返回给系统,以便调用
      空闲(tmp)
      进行潜在的重用。在这一点之后,存储器的内容可能立即改变,也可能长时间保持不变。唯一可以遵循的安全规则是,内存不再属于您,因此您不能尝试读取它。如果这没有帮助,你能试着重新说明哪些区域不清楚吗?我在函数中为一个字符串分配了空间,并将head->s复制到这个字符串,然后返回了它。它起作用了,但是我想知道每次我弹出一个元素时我分配的所有内存会发生什么?我不确定我是否理解这个问题。弹出的
      节点将其内存返回给系统,以便调用
      空闲(tmp)
      进行潜在的重用。在这一点之后,存储器的内容可能立即改变,也可能长时间保持不变。唯一可以遵循的安全规则是,内存不再属于您,因此您不能尝试读取它。如果这没有帮助,你能试着重新说明哪些区域不清楚吗?