C中指针的问题



我在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;

相关内容

  • 没有找到相关文章

最新更新