所以今天我很无聊,并决定开始我的C技能生锈,但我无法解释这个:
typedef struct Node
{
struct Node* prev;
struct Node* next;
void* data;
} Node_t;
Node_t* head = NULL;
void add(Node_t* head, void* data)
{
Node_t* newNode = (Node_t*)malloc(sizeof(Node_t));
Node_t* iterate = head;
newNode->next = newNode->prev = NULL;
newNode->data = data;
if(head == NULL)
{
/*printf("Check 0 %x\r\n", newNode);*/
head = (Node_t*)malloc(sizeof(Node_t));
head->next = head->prev = NULL;
head->data = data;
printf("Check 0.5 %x\r\n", newNode);
}
else
{
while(iterate->next != NULL)
{
iterate = iterate->next;
}
iterate->next = newNode;
newNode->prev = iterate;
}
}
int main(int argc, char** argv)
{
int addValue = 0;
int* printMe = 0;
Node_t* iterate;
for(addValue = 0; addValue < 10; addValue++)
{
add(head, &addValue);
printf("Check 1 %x\r\n", head);
}
........
printf语句打印我的头指向的内存中的位置。每次从Add()函数调用它时,它都会打印一些合理的内存位置,但一旦返回,它就会输出0(NULL)作为指针的值。两个印刷声明是一个接一个。那么为什么C在Add()函数中更新我的全局指针,但是在函数调用结束后还原它呢?
答案 0 :(得分:4)
当您调用head
时,您正在按值传递节点指针add
。您需要将指针传递给节点指针head
。因此,您需要传递&head
而不是head
才能对全局进行修改。
进行以下更改:
void add(Node_t** head, void* data)
每当您在head
中引用add
时,您需要*head
而不是head
。
像这样呼叫add
:
add(&head, &addValue);
答案 1 :(得分:1)
您的本地head
正在使全球head
黯然失色。考虑这个简化的片段:
int head;
void add(int head) {
head = 7; // analog to head=malloc() in your case
printf("head=%d\n", head);
}
int main() {
add(head);
printf("head=%d\n", head);
return 0;
}
从这个简单的案例中可以明显看出,更新head
中的局部变量add
对全局变量head
完全没有任何意义。
答案 2 :(得分:0)
我在C上也生锈了但是如果我正确地读取变量你没有分配GLOBAL变量头,你只是传递指针的位置(null)。过程中head变量的范围是严格的,在过程中并且在add过程中更改该值不会更改全局值。我相信如果你通过并且头脑,你将获得理想的效果。
for(addValue = 0; addValue < 10; addValue++)
{
add(&head, &addValue);
printf("Check 1 %x\r\n", head);
}