pointer to pointers in C
I need help with pointers in C. I've t开发者_C百科wo structures a struct made like this:
typedef struct s{
s2** d;
struct s* next;
}s;
typedef struct s2{
c* fi;
struct s2* next;
}s2;
And I have a function like this one:
void modify(c* a, s2* b){ //c* is a pointer to a struct
s* rd = malloc(sizeof(s);
rd->next = NULL;
//need also to initialize the field "d" of the "s" struct
}
This is generating error. I need the structure rd to point to b as in the example. I need to store a double pointer because s2 are linked in list-like fashion, so I need the ** pointer to have the possibility to remove the first element of the list. I was doing the assignment in the comment like rd->d = &b but when I try to deference the field "d" in a function I have an invalid memory read and I can't understand why.
I suppose the problem is this:
You pass in s2* b as an argument to modify, thus this pointer resides on the stack. Now when you assign rd->d = &b, you take that location on the stack, which will only be valid until execution leaves the scope of modify. Thus, when you dereference rd->d later on, you access that (now invalid) location on the stack, which yields garbage or a crash. (However, in this scenario, you should be able to dereference rd->d correctly while still in modify.)
Probably you'd want to alter how b is passed into modify, most likely into something like s2** b, so that you can correctly pass in a pointer to a pointer to s2 in another structure, instead of making it a pointer to s2 sitting on the stack for modify.
Basically like this:
void modify(c* a, s2** b) {
s* rd = malloc(sizeof(s));
rd->next = NULL;
rd->d = b;
}
and call it like
s2* myS2 = ...;
modify(<whatever>, &myS2->next);
This should allow you to pass the location of a pointer to a s2 instance which you can store away and dereference even after modify finishes (untested, though).
加载中,请稍侯......
精彩评论