我的工作保存指针数组结构的C程序。 首先,结构是这样的:
typedef struct
{
int ID;
char Name [20];
} rec;
然后,我有一个创建这些结构的1功能:
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;
}
对于检查会发生什么我打印保存在指针数组的地方的价值观。 此时指针数组中的值是正确的。
但是现在我需要的malloc空间,这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
为指针,以指针 :
rec **pointerArray;
pointerArray = returnPointerToPointerArray(/*2*/);