[英]C : Why isn't my global variable updating?
所以今天我很無聊,並決定開始我的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()函數中更新我的全局指針,但是一旦函數調用結束就恢復它?
你是路過的節點指針head
的價值,當你調用add
。 您需要將指針傳遞給節點指針head
。 所以你需要傳遞&head
而不是head
,以便對全局進行修改。
進行以下更改:
void add(Node_t** head, void* data)
每當你指的head
在add
你需要*head
,而不是head
。
呼叫add
如下:
add(&head, &addValue);
您當地的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
。
我也在C上生銹,但如果我正確地讀取變量你沒有分配GLOBAL變量頭,你只是傳遞指針的位置(null)。 過程中head變量的范圍是嚴格的,在過程中並且在add過程中更改該值不會更改全局值。 我相信如果你通過和頭部,你將獲得理想的影響。
for(addValue = 0; addValue < 10; addValue++)
{
add(&head, &addValue);
printf("Check 1 %x\r\n", head);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.