stack.h
#define MAX_STACK 10
typedef int STACK_ITEM;
typedef struct Stack *STACK ;
stack.c
#include"stack.h"
struct Stack{
STACK_ITEM contents[MAX_STACK];
int tos;
};
_Bool create_stack(STACK s){
s = malloc(sizeof(struct Stack));
if(s == NULL )
return 0;
s->tos = 0;
return 1;
}
当拨打电话时create_stack
功能,不影响s
(指向结构的指针)。所以,我的问题是:为什么s
not改变,即使它是一个指针,而不是一个值,传递?
请记住,在 C 中所有参数都是按值传递的。
当您将指针作为函数参数传递时,您可以访问该指针指向的对象(或对象数组)。
Your create_stack()
传递一个指向 a 的指针struct Stack
, 那就是s
范围。那么它ignores的原始值s
并重新分配它。这是允许的,但请注意没有改变调用者中的原始指针create_stack()
因为函数参数是按值传递.
有两种方法可以做你想做的事。
第一种方法是将指针传递给指针:
_Bool create_stack(STACK *s){
*s = malloc(sizeof(struct Stack));
if(*s == NULL )
return 0;
(*s)->tos = 0;
return 1;
}
称之为例如:
STACK mystack;
_Bool ret;
ret = create_stack(&mystack);
if (!ret) {
/* error */
}
第二种方法是不传递任何内容并返回指向已分配堆栈的指针:
STACK create_stack(void){
STACK s = malloc(sizeof(struct Stack));
if(s != NULL ) {
s->tos = 0;
}
return s;
}
称之为例如:
STACK s;
s = create_stack();
if (s == NULL) {
/* error */
}
最后,作为编程风格的一点,不要typedef
按照您所做的方式进行指导。如果指针是显式的,那就更清楚了,例如,使用typedef struct Stack STACK;
代替typedef struct Stack *STACK;
并相应地调整用法,例如替换STACK s
with STACK *s
并更换STACK *s
with STACK **s
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)