簡體   English   中英

取消引用指針如何返回垃圾值?

[英]how does dereferencing a pointer return garbage value?

我找不到任何類似的東西,如果在此之前被問到任何類似的問題,請隨時關閉它。 我有一個定義如下所示的結構

typedef  struct  linked_list{
       int * data;
       struct linked_list *llink;
       struct linked_list *rlink;
   } List;

我有一個功能

List * getitem(List* first){
       int temp_data ;
       int * intPtr;
       List * ptr = (List *) calloc(1, sizeof(List));
       if ( ptr == NULL){
          printf("Memory allocation failed");
          exit(0);
      }
      ptr->data= (int*) calloc (1, sizeof(int));
      if ( ptr->data == NULL) {
          printf("Mem alloc failed");
          exit(0);
      }
  
  
      // for now only allow int type
      printf("Enter the data you need");
      scanf("%d", &temp_data);
      ptr->data = &temp_data;
      printf("%d\n",*(ptr->data) );
  
      if (first == NULL){
         ptr->data= &temp_data;
         ptr->llink = NULL;
         ptr->rlink = NULL;
         printf("pointer valu = %p \n", ptr);
          printf("check data = %p \n", ptr->data);
       printf("%d\n",*(ptr->data) );
  
         return ptr;
      } else{
          first->llink= ptr;
          ptr->rlink=first;
          ptr->llink = NULL;
          ptr->data = &temp_data;
          printf("pointer valu = %p \n", ptr);
          printf("check data = %p \n", ptr->data);
  
          return ptr;
      }
  }

我將一個指針傳遞給函數 ** getitem(List* first) ** 分配一些值返回相同的值。 但是當我在 main 中取消引用它時,它會打印一些垃圾值。 我無法將相同的指針傳遞給另一個函數 ** display_items(List* first); ** 並使用它。我可能會遺漏一些簡單的東西,任何幫助將不勝感激。

       int choice;
       List * First= NULL;
      for(;;){
          printf("1: to enter");
          printf("2: to display");
          scanf("%d", &choice);
          switch(choice){
              case 1:
                 First =  getitem( First);
                 printf("Checking if first actually has someting\n");
                 printf("%d\n",*(First->data));
                  break;
              case 2:
                  display_items(First);
                  break;
              default:
                  exit(0);
          }
  
      }
 
  }
 ptr->data= (int*) calloc (1, sizeof(int));
 if ( ptr->data == NULL) {
     printf("Mem alloc failed");
     exit(0);
 }


 // for now only allow int type
 printf("Enter the data you need");
 scanf("%d", &temp_data);
 ptr->data = &temp_data;

您分配內存並將指向它的指針存儲在ptr->data ,但隨后您泄漏了該內存並將ptr->data更改為指向temp_data 所以在函數返回后, ptr->data指向一個不再存在的對象——它是一個垃圾指針。 所以它指向一個垃圾值也就不足為奇了。

而不是ptr->data = &temp_data; ,你的意思是, *ptr->data = temp_data; .

真的,您應該首先使用以下方法讀取您想要的數據,
scanf("%d", ptr->data); .

暫無
暫無

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

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