返回指向结构的指针数组的指针

时间:2014-11-03 18:32:45

标签: c pointers 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空间并返回指向此指针数组的指针,这就是我卡住的地方。

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

3 个答案:

答案 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;
}

Live Example

完成后,您还应该释放已分配的内存。

答案 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*/);