C语言 中结构向量的扩展

irlmq6kh  于 2022-12-02  发布在  其他
关注(0)|答案(1)|浏览(153)

我试着用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;

}
1tuwyuhd

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是什么。sstack_t **(*s)stack_t *(*s)[*l](*s)指向的数组的*lth元素。
看看另一个不起作用的原因,(s[*l])stack_t *数组的*lth元素,然后*s(*l])*lthstack_t *数组的第0个元素。只有当*l0时,它才起作用。
这可能会让人感到困惑,但你可以通过将其编码为s[0][*l]来避免()。一种更干净的清理方法是解引用s并将其保存在一个局部变量中,类似于:

void put_on_fun_stack(stack_t **ps, char *name, int *pl, int n){
    stack_t *s;
    int l=*pl;

    s = realloc(*ps, (l+1) * sizeof(stack_t));
    s[l].name = name;
    s[l].n = n;
// return the updated values
    *pl=l+1;
    *ps=s;
}

相关问题