[英]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.