返回指针到一个结构的指针数组(returning pointer to pointer array

2019-10-21 05:20发布

我的工作保存指针数组结构的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

Answer 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;
}

活生生的例子

你也应该释放分配的内存时,即可大功告成。



Answer 2:

这里有两个问题,我确定:

首先,你回到你复制的结果之前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);

此行应该能使用和申报不匹配。

更新:

发现我的答案一定的误差。 您正在返回一个指针数组。



Answer 3:

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


文章来源: returning pointer to pointer array of a struct