簡體   English   中英

指針-訪問內存位置不一致

[英]pointers - inconsistent access to memory location

我正在嘗試定義一個簡單的鏈表

#include <stdio.h>


struct node{
  int value;
  struct node* next;
};


typedef struct {
  struct node* root;
} ll;

void add_to_ll(int value, ll* linked_list) {
  struct node new_node = {value, linked_list->root};
  linked_list->root = &new_node;
}

void print_ll(ll* ll2) {
  printf("%p", ll2);
  struct node* temp = ll2->root;
  while (temp->next != NULL) {
    printf("%d ", temp->value);
    temp = temp->next;
  }
}


int main()
{
  printf("Creating a linked list...\n");
  struct node root_node = {1, NULL};
  ll my_linked_list = { &root_node };
  for (int i = 0; i < 10000; i++) {
    add_to_ll(i, &my_linked_list);
  }
  printf("my_linked_list root value %d\n", my_linked_list.root->value);
  printf("my_linked_list root value %d\n", my_linked_list.root->value);
  printf("my_linked_list root value %d\n", my_linked_list.root->value);
  return 0;
}

我得到的輸出是:

Creating a linked list...
my_linked_list root value 9999
my_linked_list root value 429391991
my_linked_list root value 429391991

我能夠在第一時間正確獲得rootvalue 但是在嘗試第二次(及其后)讀取時,該值會更改。 我想念什么?

您的問題與添加中的內存分配策略有關。

void add_to_ll(int value, ll* linked_list) {
  struct node new_node = {value, linked_list->root};
  linked_list->root = &new_node;
}

在這里,您將new_node設置為局部變量。 非靜態局部變量的壽命等於其塊的壽命。 退出該塊后,該內存(實際上是堆棧)可用於將覆蓋對象的連續分配。 使用顯式分配,即malloc ,使對象的壽命獨立於分配范圍。

我還要指出命名...最明確的名稱應該是類型的名稱,而不是變量。 所以struct linked_list ll而不是相反。

該功能:

void add_to_ll(int value, ll* linked_list) {
  struct node new_node = {value, linked_list->root};
  linked_list->root = &new_node;
}

在堆棧上構造一個節點並將其添加到列表中。 從此函數返回時,將彈出堆棧,並且列表根指向堆棧上未分配的內存,以后將重用該內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM