为什么在C链表中追加失败
Why the appending in C linked list failed
我是C新手,现在正在做人脸检测的链表。
下面是在链表末尾附加面的结构和方法。
//Structure for storing a face with x, y and window size
typedef struct Face {
int window;
int x;
int y;
struct Face* next;
} Face;
//Append face(window, x, y) to the end of linked list starting from head
void push(Face* head, int window, int x, int y) {
Face* temp = (Face *)malloc(sizeof(Face));
temp->window = window;
temp->x = x;
temp->y = y;
temp->next = NULL;
Face* cur = head;
if (head == NULL) {
printf("Called\n");
head = temp;
} else {
while (cur->next != NULL) {
cur = cur->next;
}
cur->next = temp;
}
}
在另一个文件中,可执行文件,我调用了 push(head, 1, 2, 3)[这里的 head 被初始化为 NULL]。
屏幕上只打印“Called”。当我检查链表时,head 在可执行文件中仍然是 NULL。
我不知道为什么头部没有更新,但是当我把它放在同一个文件中时,它似乎工作正常。
if (head == NULL) {
printf("Called\n");
head = temp;
}
赋值head = temp
只修改了头指针的local副本。因此它不会传播到调用 push()
的代码。如果 head
在调用 push()
的代码中是 NULL
,那么它将保持不变。
例如,您可以 return 列表头,如:
Face *push(Face* head, int window, int x, int y) {
Face* temp = (Face *)malloc(sizeof(Face));
temp->window = window;
temp->x = x;
temp->y = y;
temp->next = NULL;
Face* cur = head;
if (head == NULL) {
printf("Called\n");
head = temp;
} else {
while (cur->next != NULL) {
cur = cur->next;
}
cur->next = temp;
}
return head;
}
然后像这样使用它:
/* ... */
head = push(head, window, x, y);
/* ... */
另一种方法是传递指向 head
(Face **
) 的指针,并将该赋值替换为 *head = temp;
,但如果您是初学者,我会坚持对以前的方法(在我看来,在大多数情况下不需要使用双重间接寻址,但这可能是主观的)。
最后,您可能想要处理可能的 malloc(3)
错误:分配可能会失败,您应该检查并处理这种情况。
我相信这是因为您正在传递指针 head
的值,这会创建指针的副本。通过将 head
设置为另一个地址,您不会在范围外修改 head
,而是在方法范围内修改 head
。
您需要传入指向指针的指针才能更改它。
这是一个猜谜游戏,因为您没有显示相关代码。
幸运的是,在这种情况下很容易猜到...
您传递给函数的参数是 Face *
类型,您将其设置为一个新值(您分配的新结构)。不幸的是,您没有返回此值,也没有确保输入参数能够将 "transferring" 数据返回到调用上下文。你应该做的是:
void push(Face** head, int window, int x, int y) {
// all you code here...
*head = temp
// rest of code...
}
当您调用函数时:
push(&head, 1, 2, 3);
函数参数是函数的局部变量。它们是参数的副本。所以函数参数头是参数头的副本。参数(参数副本)的任何更改都不会影响参数。你必须通过引用传递头部。
按以下方式定义函数
//Append face(window, x, y) to the end of linked list starting from head
void push( Face **head, int window, int x, int y )
{
Face *temp = malloc( sizeof( Face ) );
if ( temp != NULL )
{
temp->window = window;
temp->x = x;
temp->y = y;
temp->next = NULL;
while ( *head ) head = &( *head )->next;
*head = temp;
}
}
并像这样调用函数
push( &head, 1, 2, 3 );
我是C新手,现在正在做人脸检测的链表。 下面是在链表末尾附加面的结构和方法。
//Structure for storing a face with x, y and window size
typedef struct Face {
int window;
int x;
int y;
struct Face* next;
} Face;
//Append face(window, x, y) to the end of linked list starting from head
void push(Face* head, int window, int x, int y) {
Face* temp = (Face *)malloc(sizeof(Face));
temp->window = window;
temp->x = x;
temp->y = y;
temp->next = NULL;
Face* cur = head;
if (head == NULL) {
printf("Called\n");
head = temp;
} else {
while (cur->next != NULL) {
cur = cur->next;
}
cur->next = temp;
}
}
在另一个文件中,可执行文件,我调用了 push(head, 1, 2, 3)[这里的 head 被初始化为 NULL]。
屏幕上只打印“Called”。当我检查链表时,head 在可执行文件中仍然是 NULL。
我不知道为什么头部没有更新,但是当我把它放在同一个文件中时,它似乎工作正常。
if (head == NULL) {
printf("Called\n");
head = temp;
}
赋值head = temp
只修改了头指针的local副本。因此它不会传播到调用 push()
的代码。如果 head
在调用 push()
的代码中是 NULL
,那么它将保持不变。
例如,您可以 return 列表头,如:
Face *push(Face* head, int window, int x, int y) {
Face* temp = (Face *)malloc(sizeof(Face));
temp->window = window;
temp->x = x;
temp->y = y;
temp->next = NULL;
Face* cur = head;
if (head == NULL) {
printf("Called\n");
head = temp;
} else {
while (cur->next != NULL) {
cur = cur->next;
}
cur->next = temp;
}
return head;
}
然后像这样使用它:
/* ... */
head = push(head, window, x, y);
/* ... */
另一种方法是传递指向 head
(Face **
) 的指针,并将该赋值替换为 *head = temp;
,但如果您是初学者,我会坚持对以前的方法(在我看来,在大多数情况下不需要使用双重间接寻址,但这可能是主观的)。
最后,您可能想要处理可能的 malloc(3)
错误:分配可能会失败,您应该检查并处理这种情况。
我相信这是因为您正在传递指针 head
的值,这会创建指针的副本。通过将 head
设置为另一个地址,您不会在范围外修改 head
,而是在方法范围内修改 head
。
您需要传入指向指针的指针才能更改它。
这是一个猜谜游戏,因为您没有显示相关代码。
幸运的是,在这种情况下很容易猜到...
您传递给函数的参数是 Face *
类型,您将其设置为一个新值(您分配的新结构)。不幸的是,您没有返回此值,也没有确保输入参数能够将 "transferring" 数据返回到调用上下文。你应该做的是:
void push(Face** head, int window, int x, int y) {
// all you code here...
*head = temp
// rest of code...
}
当您调用函数时:
push(&head, 1, 2, 3);
函数参数是函数的局部变量。它们是参数的副本。所以函数参数头是参数头的副本。参数(参数副本)的任何更改都不会影响参数。你必须通过引用传递头部。
按以下方式定义函数
//Append face(window, x, y) to the end of linked list starting from head
void push( Face **head, int window, int x, int y )
{
Face *temp = malloc( sizeof( Face ) );
if ( temp != NULL )
{
temp->window = window;
temp->x = x;
temp->y = y;
temp->next = NULL;
while ( *head ) head = &( *head )->next;
*head = temp;
}
}
并像这样调用函数
push( &head, 1, 2, 3 );