【问题标题】:Pop function in a stack (C)堆栈中的弹出函数(C)
【发布时间】:2023-03-31 21:17:01
【问题描述】:

我在此程序中的pop() 函数存在一些问题。这是一个栈作为单链表的实现,你可以看到 pop 函数有两个参数:

void pop(STACK *stack, char **name)

我被告知:在pop 函数中为name 分配内存,并使用**name 参数返回name 或NULL。我尝试了几件事,但我不明白这实际上意味着什么,以及如何做到这一点,因为该函数不返回任何内容(void 类型)。一般来说,我很难理解这个**name 论点,为什么我们甚至要首先使用它。到目前为止,这是我的代码:

typedef struct _stack STACK;
typedef struct _sElem stackElement;

struct _stack{
    stackElement *head;
};

struct _sElem{
    char *name;
    stackElement *next;
};

//solved:
void pop(STACK *stack, char **name){
    if(stack == NULL || stack->head == NULL){
        printf("Stack is empty. \n");
    }else{
        stackElement *temp = stack->head;
        char **nodeName = malloc(sizeof(char*));
        char *tempName = temp->name;
        (*nodeName)=tempName;
        (*name) = (*nodeName);
        stack->head = temp->next;
        free(temp);
    }
}

int main(){
    STACK *myStack = NULL;
    char *tempName = NULL;

    push(myStack, "One");
    push(myStack, "Two");
    push(myStack, "Three");
    pop(myStack, &tempName);
    pop(myStack, &tempName);

    //free stack and tempName

    return 0;
}

感谢您的帮助。谢谢。

【问题讨论】:

标签: c stack singly-linked-list


【解决方案1】:

通常我无法理解这个 **name 参数,并且 为什么我们甚至想首先使用它。

因为在 C 中所有参数都是按值传递的。因此,如果您的函数被定义为 void pop(STACK *stack, char *name) 并且您在 pop 内分配了 name 的值,则在 pop 返回后调用者将看不到它。

相反,如果您将函数定义为:void pop(STACK *stack, char **name),那么您可以分配给 *name,以便调用者可以访问新值。

例如:

STACK *head = ...
char *name = NULL;
pop(head, &name);
if (name != NULL)
{
   fprintf(stdout, "Popped name: %s\n", name);
   free(name);
}

【讨论】:

  • 谢谢你的解释,我是否也需要为pop函数中的名称分配内存为char *name = malloc(sizeof(char))或什么?
  • 是的。但您需要分配正确的大小。 :)
猜你喜欢
  • 2016-06-29
  • 1970-01-01
  • 2017-02-08
  • 1970-01-01
  • 2023-03-25
  • 2020-09-14
  • 2013-03-20
  • 1970-01-01
  • 2012-10-14
相关资源
最近更新 更多