首页 文章

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

提问于
浏览 198
1

我正在研究一个C程序,它包含一个指向结构的指针数组 . 首先,struct看起来像这样:

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 回答

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

    实例

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

  • 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);
    

    这一行应该使用和声明不匹配 .

    更新:

    在我的回答中发现了一些错误 . 你正在返回一个指针数组 .

  • 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 不同!

    其次,你应该将 pointer to pointer 返回 rec . 返回数组时,数组名称将转换为指向其第一个元素的指针,该元素本身就是一个指针 .

    此外,您已将 pointerArray 声明为实际数组 . 您不能为数组指定新值,也不能返回指向局部变量的指针 . pointerArray 的生命周期在执行离开此函数时结束,因此指向它的指针将完全无用 . 使用这样的指针会导致未定义的行为 .

    你需要 first 为数组分配动态内存,填充数组,然后返回它:

    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 to pointer

    rec **pointerArray;
    pointerArray = returnPointerToPointerArray(/*2*/);
    

相关问题