为什么我不能将指针分配给双指针的指针?我每次都会遇到段错误。
#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/