我试着用C写一个栈,但是遇到了一些关于realloc的问题,最后我写了一个可以工作的程序,但是我不明白为什么它可以工作,为什么我必须在函数put_on_fun_stack和get_from_fun_stack的输入中给予一个指向我的结构表的指针。
当我试图给予它像put_on_fun_stack(stack_t *s,...)它不工作。为什么我必须把指针放在realloc中,为什么我必须写一个(*s)[*l],而我不能写 *s[*l]。有人能解释一下指向结构的指针吗?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct {
int *n;
char *name;
}stack_t;
void init(stack_t **s){
*s=malloc(0);
}
void put_on_fun_stack(stack_t **s, char *name, int *l, int n){
*s = realloc(*s, (*l+1) * sizeof(stack_t));
(*s)[*l].name = name; //why do i need (*s) ?
(*s)[*l].n = n;
*l=*l+1;
}
char* get_from_fun_stack(stack_t **s, int *l){
char *temp = (*s)[*l-1].name;
*s = realloc(*s, (*l - 2) * sizeof(stack_t));
*l=*l-2;
return temp;
}
void rm(stack_t *s){
free(s);
}
int main(int argc, char **argv){
char *name;
stack_t* s;
init(&s);
int i;
int l=0;
srand(time(0));
if (argc>1)
for(i=1;i<argc;i++){
printf("%s\n", argv[i]);
put_on_fun_stack(&s, argv[i], &l, rand()%10);
printf("name=%s, n=%d, l=%d \n", s[l-1].name,s[l-1].n, l-1);
}
rm(s);
return 0;
}
1条答案
按热度按时间1tuwyuhd1#
C是传值的,所以当你调用
put_on_fun_stack()
时,你只传递了s
,你得到的是main的值s
的拷贝,而不是s
的地址。你不能改变main
中的s
的值。换句话说,当您将其编码为s = realloc(s, (*l - 2) * sizeof(stack_t));
时,您只是更改了put_on_fun_stack()
中s
的值,而不会影响main
中的s
。您通过将main中的
s
地址传递给put_on_fun_stack()
来修复此问题,因此编码为*s = realloc(*s, (*l - 2) * sizeof(stack_t));
时,main
中的s
值将根据需要进行设置。至于
(*s)[*l]
与*s[*l]
,这是一个运算符优先级的问题。[]
比*
绑定得更紧,所以*s[*l]
与*(s[*l])
相同。这不是你想要的。如果你的问题是,为什么
(*s)[*l]
工作,你必须看看s
是什么。s
是stack_t **
,(*s)
是stack_t *
,(*s)[*l]
是(*s)
指向的数组的*lth
元素。看看另一个不起作用的原因,
(s[*l])
是stack_t *
数组的*lth
元素,然后*s(*l])
是*lth
stack_t *
数组的第0个元素。只有当*l
是0
时,它才起作用。这可能会让人感到困惑,但你可以通过将其编码为
s[0][*l]
来避免()
。一种更干净的清理方法是解引用s
并将其保存在一个局部变量中,类似于: