C 中函数的指针 return
Pointer return by a function in C
以下是制作一个有2个指针的链表的代码。正在创建(打印)链表并且所有指针(prev + next)都很好。但是当我调用函数 "copay" 并将其值(指针)分配给 "duplicate" 时,我遇到了分段错误但是如果我只使用 "copay" 并且不将它分配给任何其他变量那么就没有问题了。
typedef struct node {
int data;
struct node *next;
struct node *prev;
} node;
void insert(node **head, int data) {
node *new = (struct node *)malloc(sizeof(node));
new->data = data;
new->next = NULL;
node *temp = *head;
if (!(temp)) {
*head = new;
new->prev = NULL;
// printf("\n return : %d",data);
return;
}
while (temp->next)
temp = temp->next;
temp->next = new;
new->prev = temp;
// printf("\n return : %d",data);
}
void print(node **head) {
node *temp = *head;
printf("\n");
while (temp) {
printf(" %d ->", temp->data);
temp = temp->next;
}
printf(" NULL\n");
}
node *copay(node **head) {
node *temp = *head;
return temp;
}
int main() {
node *head;
insert(&head, 1);
insert(&head, 3);
insert(&head, 5);
insert(&head, 7);
insert(&head, 9);
(head)->prev = (head)->next->next;
(head)->next->next->prev = (head)->next->next->next->next;
(head)->next->next->next->next->prev = (head)->next;
print(&head);
node *duplicate = copay(&head);
// print(&duplicate);
}
copay() 实际上很好,而它是 运行。在 copay() 退出后,问题发生在它的调用者(这里是主函数)上。 copay() returns 指向节点的指针,但问题是本地节点temp仅在copay() 运行 时分配。当 copay() 退出时,它的所有局部变量都被释放。所以调用者留下了一个指向已释放节点的指针。
我建议您阅读位于本地内存上的斯坦福 CS 教育图书馆 Pointers and Memory 的第 2 部分。
函数中有一个很简单的问题main()
:
node *head;
head
已定义但未初始化。您必须将其初始化为 NULL
才能使 insert()
正常运行,否则您会遇到 未定义的行为 。顺便说一句,将一个实际上 将一个节点追加 一个节点的函数命名为 insert
是令人困惑的。将此行更改为:
node *head = NULL;
我不明白你试图用这些行来实现:
(head)->prev = (head)->next->next;
(head)->next->next->prev = (head)->next->next->next->next;
(head)->next->next->next->next->prev = (head)->next;
其余的我觉得还不错。
以下是制作一个有2个指针的链表的代码。正在创建(打印)链表并且所有指针(prev + next)都很好。但是当我调用函数 "copay" 并将其值(指针)分配给 "duplicate" 时,我遇到了分段错误但是如果我只使用 "copay" 并且不将它分配给任何其他变量那么就没有问题了。
typedef struct node {
int data;
struct node *next;
struct node *prev;
} node;
void insert(node **head, int data) {
node *new = (struct node *)malloc(sizeof(node));
new->data = data;
new->next = NULL;
node *temp = *head;
if (!(temp)) {
*head = new;
new->prev = NULL;
// printf("\n return : %d",data);
return;
}
while (temp->next)
temp = temp->next;
temp->next = new;
new->prev = temp;
// printf("\n return : %d",data);
}
void print(node **head) {
node *temp = *head;
printf("\n");
while (temp) {
printf(" %d ->", temp->data);
temp = temp->next;
}
printf(" NULL\n");
}
node *copay(node **head) {
node *temp = *head;
return temp;
}
int main() {
node *head;
insert(&head, 1);
insert(&head, 3);
insert(&head, 5);
insert(&head, 7);
insert(&head, 9);
(head)->prev = (head)->next->next;
(head)->next->next->prev = (head)->next->next->next->next;
(head)->next->next->next->next->prev = (head)->next;
print(&head);
node *duplicate = copay(&head);
// print(&duplicate);
}
copay() 实际上很好,而它是 运行。在 copay() 退出后,问题发生在它的调用者(这里是主函数)上。 copay() returns 指向节点的指针,但问题是本地节点temp仅在copay() 运行 时分配。当 copay() 退出时,它的所有局部变量都被释放。所以调用者留下了一个指向已释放节点的指针。
我建议您阅读位于本地内存上的斯坦福 CS 教育图书馆 Pointers and Memory 的第 2 部分。
函数中有一个很简单的问题main()
:
node *head;
head
已定义但未初始化。您必须将其初始化为 NULL
才能使 insert()
正常运行,否则您会遇到 未定义的行为 。顺便说一句,将一个实际上 将一个节点追加 一个节点的函数命名为 insert
是令人困惑的。将此行更改为:
node *head = NULL;
我不明白你试图用这些行来实现:
(head)->prev = (head)->next->next;
(head)->next->next->prev = (head)->next->next->next->next;
(head)->next->next->next->next->prev = (head)->next;
其余的我觉得还不错。