我正在开发一个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空间并返回指向此指针数组的指针,这就是我卡住的地方。
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
答案 0 :(得分:1)
此代码没有意义:
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;
}
完成后,您还应该释放已分配的内存。
答案 1 :(得分:0)
我发现了两个问题:
首先,在将结果复制到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);
这一行应该使用和声明不匹配。
更新:
在我的回答中发现了一些错误。你正在返回一个指针数组。
答案 2 :(得分:0)
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
定义为指向指针的指针:
rec **pointerArray;
pointerArray = returnPointerToPointerArray(/*2*/);