簡體   English   中英

返回指向結構體的指針數組的指針

[英]returning pointer to pointer array of a struct

我正在使用一個C結構程序,該結構包含指向結構的指針數組。 首先,該結構如下所示:

typedef struct
{
    int ID;
    char Name [20];
} rec;

然后,我有一個函數可以創建以下結構之一:

struct rec* addEntry(){
    rec *temp;
    temp = malloc(sizeof(rec));
    printf("Please give me an ID number\n");
    scanf("%d", &temp->ID);

    printf("Now give me a name, maximum size for this is 20 characters\n");
    scanf("%s", &temp->Name);
    return temp;
}

現在,此函數可以正常工作,它會創建該結構並返回指向該結構的指針,然后我還有另一個函數來創建一個指針數組,並用指向該結構的指針填充它:

struct rec* returnPointerToPointerArray()
{
    rec *pointerArray[2];
    pointerArray[0] = addEntry();
    pointerArray[1] = addEntry();
    printf("ID in main : %d\n", pointerArray[0]->ID);
    printf("Name in main : %s\n", pointerArray[0]->Name);
    printf("ID in main : %d\n", pointerArray[1]->ID);
    printf("Name in main : %s\n", pointerArray[1]->Name);
    pointerArray = malloc(sizeof(rec*)*2);
    return pointerArray;
}

為了檢查發生了什么,我打印了存儲在指針數組中位置的值。 此時,指針數組中的值正確。

但是現在我需要為該pointerArray分配空間並返回一個指向該指針數組的指針,這就是我遇到的問題。

malloc行給我一個錯誤:

error: incompatible types when assigning to type 'struct rec *[(sizetype)(size)]' from type 'void *'

現在澄清一下,我不能使用鏈表,而必須使用指針數組。 要添加到我的主循環中,我在以下代碼中出現另一個錯誤:

rec *pointerArray[2];
pointerArray = returnPointerToPointerArray(2);
printf("ID in main : %d\n", pointerArray[0]->ID);
printf("Name in main : %s\n", pointerArray[0]->Name);

這給了我以下錯誤:

error: incompatible types when assigning to type 'struct rec *[2]' from type 'struct rec *'

歡迎您提供任何幫助。

在此先感謝,Ylva

這段代碼沒有意義:

struct rec* returnPointerToPointerArray()
{
    rec *pointerArray[2];
    pointerArray[0] = addEntry();
    pointerArray[1] = addEntry();
    ...
    pointerArray = malloc(sizeof(rec*)*2);
    return pointerArray;
}

您正在定義一個指針堆棧數組,並為它們的struct rec對象分配堆地址,然后嘗試將兩個指針的基於堆的數組分配給堆棧地址之一。 它永遠不會編譯。

由於您的函數旨在返回一個指向rec類型的對象的指針(我想它將是數組中兩個結構中的第一個),因此您應該首先在堆上為兩個指針分配空間(並因此使用雙指針),然后填充/返回:

struct rec** returnPointerToPointerArray()
{
    rec **pointerArray;
    pointerArray = malloc(sizeof(rec*)*2); // Allocates 2 pointers
    pointerArray[0] = addEntry();
    pointerArray[1] = addEntry();
    ...
    return pointerArray;
}

現場例子

完成后,您還應該釋放分配的內存。

我在這里確定了兩個問題:

首先,在將結果復制到pointerArray之前返回。

pointerArray = malloc(sizeof(rec*)*2);
return pointerArray;

我的建議是

struct rec** returnPointerToPointerArray()
{
    rec *pointerArray[2];
    pointerArray[0] = addEntry();
    pointerArray[1] = addEntry();
    printf("ID in main : %d\n", pointerArray[0]->ID);
    printf("Name in main : %s\n", pointerArray[0]->Name);
    printf("ID in main : %d\n", pointerArray[1]->ID);
    printf("Name in main : %s\n", pointerArray[1]->Name);
    rec **pointerArray2 = malloc(sizeof pointerArray);
    pointerArray2[0] = pointerArray[0];
    pointerArray2[1] = pointerArray[1];
    return pointerArray2;
}

注意,我已經更改了變量名。 您確實在代碼中犯了一些其他錯誤。

第二,

rec *pointerArray[2];

是一個指針數組。 聲明它的方式很簡單:

rec **pointerArray;

順便說一句,

pointerArray = returnPointerToPointerArray(2);

該行應使用法和聲明不匹配。

更新:

在我的答案中發現了一些錯誤。 您正在返回一個指針數組。

typedef struct
{
    int ID;
    char Name [20];
} rec;

struct rec* returnPointerToPointerArray()
{
    rec *pointerArray[2];
    pointerArray[0] = addEntry();
    pointerArray[1] = addEntry();
    ...
    return pointerArray;
}

返回類型是錯誤的,原因有兩個。 該函數返回一個rec * ,同時聲明該函數返回指向未定義struct rec *的指針。 類型struct rec與typedef rec

其次,您應該返回一個指向 rec 指針 當您返回數組時,數組名稱將轉換為指向其第一個元素的指針,該元素本身就是一個指針。

另外,您已將pointerArray聲明為實際數組。 您不能為數組分配新值,也不能返回指向局部變量的指針。 當執行離開該函數時, pointerArray的生命周期結束,因此指向它的指針將完全無用。 使用這樣的指針會導致未定義的行為

您需要首先為數組分配動態內存,填充數組,然后返回它:

rec** returnPointerToPointerArray()
{
  rec **pA = malloc (2 * sizeof *pA);
  if (pA) {
    pA[0] = addEntry();
    pA[1] = addEntry();
    if (pA[0]) {
      printf("ID in main : %d\n", pA[0]->ID);
      printf("Name in main : %s\n", pA[0]->Name);
    }
    if (pA[1]) {
      printf("ID in main : %d\n", pA[1]->ID);
      printf("Name in main : %s\n", pA[1]->Name);
    }
  }
  return pA;
}

同樣的問題在這里:

rec *pointerArray[2];
pointerArray = returnPointerToPointerArray(2);
printf("ID in main : %d\n", pointerArray[0]->ID);
printf("Name in main : %s\n", pointerArray[0]->Name);

您不能為數組分配新值。 您需要將pointerArray定義為指向pointer的指針

rec **pointerArray;
pointerArray = returnPointerToPointerArray(/*2*/);

暫無
暫無

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

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