gpt4 book ai didi

c - 堆栈中的弹出函数 (C)

转载 作者:行者123 更新时间:2023-11-30 14:48:42 24 4
gpt4 key购买 nike

我在这个程序中的 pop() 函数遇到一些问题。这是 stack 作为单链表的实现,正如您所看到的 pop 函数有两个参数:

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

我被告知:在 pop 函数中为 name 分配内存,并返回 nameNULL使用 **name 参数。我已经尝试了几件事,但我不明白这实际上意味着什么,也不明白如何做到这一点,因为该函数不返回任何内容(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;
}

我很感激任何帮助。谢谢。

最佳答案

Generally I am having trouble understanding this **name argument, and why would be we even want to use that in the first place.

因为在 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);
}

关于c - 堆栈中的弹出函数 (C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50221785/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com