我在这个程序中遇到了pop()
函数的一些问题。这是堆栈作为单链表的实现,正如您所看到的,pop函数有两个参数:
void pop(STACK *堆栈,char **名称)
我被告知:在name
函数中为pop
分配内存,并使用name
参数返回NULL
或**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;
}
我感谢任何帮助。感谢。
答案 0 :(得分:1)
一般来说,我无法理解这个**名称的论点,而且 为什么我们甚至想要首先使用它。
因为在C中所有参数都是按值传递的。因此,如果您的功能被定义为void pop(STACK *stack, char *name)
而您在name
内分配了pop
的值,那么在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);
}