c - 双指针指针

标签 c pointers linked-list double-pointer

为什么我不能将指针分配给双指针的指针?我每次都会遇到段错误。

#include <stdio.h>

int main() {
    int **pointer1, *pointer2, *pointer3, var;

    var = 10;
    pointer3 = &var; 
    pointer1 = &pointer3;
    pointer2 = *pointer1;   //correcting my mistake, so this is now correct?

    return 0;
}

我实际正在编写的代码,练习链表:

#include <stdio.h>
#include <stdlib.h>

typedef struct node_t {
    int num;
    struct node_t *next;
} node_t;

void insert(int, node_t**);

int main(void) {
    int list;
    node_t **head, *temp;

    *head = NULL;

    while (scanf("%d", &list) != EOF) {
        insert(list, head);
    }
    temp = *head;
    /*while (temp != NULL) {      //here is the problem, if I remove this 
                                  //I get segmentation fault but it runs 
        printf("%d ", temp->num); //runs fine when I include it
        temp = temp->next;

    }*/
    return 0;
}

void insert(int list, node_t **head) {
    node_t *temp = malloc(sizeof(node_t));
    temp->next = (*head);
    temp->num = list;
    (*head) = temp;
}

就像我在代码注释中放入的内容一样,当我在没有 while 循环的情况下编译时,上面版本的代码会出现段错误。但奇怪的是,一旦我包含 while 循环,它就可以正常工作。经过一番摆弄后,我怀疑罪魁祸首是双指针,我试图将辅助地址分配给常规指针。 但这个版本实际上运行得很好:

#include <stdio.h>
#include <stdlib.h>

typedef struct node_t {
    int num;
    struct node_t *next;
} node_t;

void insert(int, node_t**);

int main(void) {
    int list;
    node_t *head, *temp;

    head = NULL;

    while (scanf("%d", &list) != EOF) {
        insert(list, &head);
    }
    temp = head;
    while (temp != NULL) {

        printf("%d ", temp->num);
        temp = temp->next;

    }
    return 0;
}

void insert(int list, node_t **head) {
    node_t *temp = malloc(sizeof(node_t));
    temp->next = (*head);
    temp->num = list;
    (*head) = temp;
}

在这里,我将地址传递到链表函数中,本质上我正在做同样的事情,但没有双指针。

顺便说一句,我已经看到了链表的许多不同实现。我的需要双指针,因为我使用的是 void insert(int, **node_t),但有些版本返回地址并更新头部: node_t* insert(int, *node_t) 和全局链表:void insert(int)。只是想知道哪些版本是真正推荐的,更容易调试并且对初学者友好。

最佳答案

您的第一个示例出现段错误,因为 *pointer1 (以及它之前的 pointer1)没有指向任何内容。它是一个未初始化的指针,指向内存中的随机垃圾数据。

尝试取消引用此类指针 (**pointer1 = 10;) 会导致段错误

使您的第一个示例正常工作的解决方案是为您尝试存储的数据分配一些内存:

int **pointer1, *pointer2;

int *data = malloc(sizeof(int));

pointer1 = &data;
**pointer1 = 10;

pointer2 = *pointer1;

free(*pointer1); //or free(data)

关于c - 双指针指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52244836/

相关文章:

c - append 到链接列表,代码并不总是有效

c - 检查数组元素为 null 时出错

c - C中的远程同步目录

c - C 算法中的平方根问题

c - 我应该使用哪种类型的指针? ptrdiff_t 还是 void*?

c - 目标文件如何在 C 中链接?解释这种特殊情况

c - 将 char 指针传递给函数的替代方法

c - 基本链表的解释?

java - 双向链表逻辑

c - 此操作的 unsigned long int 是否正确?