我是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("Calledn");
head = temp;
} else {
while (cur->next != NULL) {
cur = cur->next;
}
cur->next = temp;
}
}
在另一个文件,即可执行文件中,我称之为push(head,1,2,3([此处的head初始化为NULL]。
屏幕上只显示"Called"。当我检查链表时,可执行文件中的头仍然为NULL。
我不知道为什么头没有更新,但当我把它放在同一个文件中时,它似乎工作得很好。
这是一个猜谜游戏,因为您没有显示相关的代码。
幸运的是,在这种情况下很容易猜测。。。
传递给函数的参数类型为Face *
,并将其设置为新值(分配的新结构(。不幸的是,您没有返回此值,也没有确保输入参数能够将数据"传输"回调用上下文。你应该做的是:
void push(Face** head, int window, int x, int y) {
// all you code here...
*head = temp
// rest of code...
}
当你调用函数时:
push(&head, 1, 2, 3);
if (head == NULL) {
printf("Calledn");
head = temp;
}
赋值head = temp
仅修改头指针的本地副本。因此,它不会传播到调用push()
的代码中。如果head
在调用push()
的代码中是NULL
,那么它将保持原样
例如,您可以返回列表标题,如:
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("Calledn");
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
。
您需要传入一个指向指针的指针来更改它。
函数参数是函数的局部变量。它们是论据的副本。因此,函数参数头是参数头的副本。参数(参数副本(的任何更改都不会影响参数。你必须以参考的方式通过头部。
按照以下方式定义功能
//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 );