我在C中有一个指针和结构的问题(我知道,我知道,非常基本!)。我在实践我的程序范式。这是我第一次使用调试器,因为在我生命的早期我并没有真正需要它:<所以我如果你能帮助我,我会很感激的。>
我定义了下面的结构来创建一个列表:typedef struct node {
int info;
struct node *next;
struct node *prev;
} node_t;
然后用这个函数填满它:
void addNodo(node_t * list, int x){
node_t * pointer;
node_t * temp;
temp = (node_t *)malloc(sizeof(node_t));
temp->info = x;
temp->next = NULL;
temp->prev = NULL;
pointer = list;
if(pointer == NULL){ //it's empty so start it
list = temp;
return;
}
if (pointer->info <= x) { //I like my lists tidy so...
while((pointer->next != NULL) && (pointer->info <= x)){
pointer = pointer->next;
}
if(pointer->next == NULL){
pointer->next = temp;
temp->prev = pointer;
return;
}
pointer->next->prev = temp;
temp->next = pointer->next;
temp->prev = pointer;
pointer->next = temp;
return;
}
}
然后,这样做:
int main(int argc, char** argv) {
node_t * list = NULL;
addNodo(list, 1);
printf("x: %d", list->info);
return (EXIT_SUCCESS);
}
它给了我一个分割错误!当我调试它时,一切都很有趣,直到它通过++++行,列表地址回到0x0,无法让它工作。我知道哪里有错误,但就我对指针的了解,这是完全没问题的。
当你调用addNode()
时,你通过值传递指针。所以当你在函数主体内改变它时,改变就会消失,不会传播到函数外。你需要将它声明为:
void addNode(node_t **pointer, int x)
然后在函数中使用*pointer
。
在main中调用ity时,传入&list
问题是你不能在addNodo函数中修改列表。在C语言中,参数是按值发送的,所以你在"addNodo"中所做的更改是局部的。
你需要改变addNodo函数,这样,它实际上接收列表的方向。
void addNode(node_t **list, int x){
...
if(*pointer==NULL){
*list = temp;
}
}
然后在main中使用:
addNode(&list, 1);
好吧,你犯了按值传递列表地址的错误。因此,函数的所有参数都被复制,然后您的addNodo()在复制的变量上工作。因此,原始列表不会被修改。
调用时应该做的是:
addNodo(&list, 1);
在函数中做如下修改:
void addNodo(node_t ** list, int x)
/* This will enable you to get a copy of the address of the list variable.
Please note that this is also pass by value, C does not support pass by
reference */
然后做如下修改:
pointer = *list;
/* this will make the pointer point to the beginning of list as now
list is a pointer to pointer type */
希望对你有帮助。
顺便说一句,请阅读一本标准的C书(我推荐K&R)来熟悉C中传递参数以及内部发生的事情。
你犯了一个典型的错误:
void addNodo(node_t * list, int x)
...
list = temp;
return;
list
在调用者(main())中没有改变
您可以更改list
所指向的内存中的值,但是您不能更改list
的值并让调用者看到它。
为了做到这一点,你需要传递一个指向指针的指针到函数:
void addNodo(node_t **list int x)
这允许你改变列表的指向:
*list = temp;