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

时间:2011-02-03 14:51:29

标签: c pointers data-structures

所以,我有一点问题。我正在尝试构建一个哈希表,但我一直收到一条错误,说“从不兼容的指针类型返回”。我知道这意味着什么,但我不知道为什么我的代码不起作用。我正在寻找解释为什么我的代码无效。为什么它不能将数组识别为指针?

我正在为哈希表创建一个指向数组的指针数组。 (外部链接) (我知道我的代码可能真的很糟糕><我还在学习!)

struct hashTBL {

    char *userID;
    char *password;
    struct hashTBL *next;
};

typedef struct hashTBL Tbl;
typedef struct hashTBL* TblPTR;

TblPTR createHashTBL(int size)
{
    char *userID;
    char *password;
    int i;

    TblPTR hashArray[size];

    FILE* fpData;
    char *fileName = "encrypted.txt";

    fpData = openReadFile(fileName);

    TblPTR T = NULL;

    while((fscanf(fpData, "%s", userID)) != EOF)
    {
        fscanf(fpData, "%s", password);
        i = hash(userID, size); 



        if(hashArray[i] != NULL) 
        {
            TblPTR H = hashArray[i];

            while(H != NULL)
            {
                T = H;
                H = H->next;
            }
            H = newPTR(userID, password, T);
        }
        else
        {
            hashArray[i] = newPTR(userID, password, T);
        }

    }
    closeFile(fpData);
    return &hashArray;  
}



TblPTR newPTR(char *userID, char *password, TblPTR T)
{

    TblPTR H = (TblPTR)malloc(sizeof(Tbl));
    if(T != NULL) T->next = H;
    H->userID = userID;
    H->password = password;
    H->next = NULL;

    return H;
}

4 个答案:

答案 0 :(得分:4)

你至少有两个问题。

首先,您的createHashTBL()函数被定义为返回TblPTR对象,并且您将返回指向TblPTR个对象的数组的指针。您应该更改函数类型以匹配您正在尝试的返回类型,或者返回正确类型的对象。

其次,hashArraycreateHashTBL()函数中进行堆栈分配,这意味着您无法返回指向它的指针。当函数返回时它会消失。您应该尝试使用malloc()分配数组,或让调用者提供指向预分配数组的指针。

答案 1 :(得分:2)

TblPTR hashArray[size];在堆栈上创建,无法返回,因为您的变量将在函数末尾被销毁。

您应该使用malloc()或static TblPTR hashArray[size];(不推荐)。

这是错误的:

    return &hashArray;

您正在返回指向数组的指针:(TblPTR *)。只是做

    return hashArray;

答案 2 :(得分:0)

您的编译器错误暗示它也可能是另一个问题,例如缺少typedef。您应该始终复制/粘贴错误消息,以便我们检查它们,并指出您粘贴的代码中的错误行 - 这将有助于每个人理解问题

但这里有一些错误。

TblPTR createHashTBL(int size) {

 ... 
 TblPTR hashArray[size];
 ..

 return &hashArray;
}
  • 您无法返回指向局部变量的指针 - 当函数返回
  • 时该变量已消失
  • createHashTable被声明为返回TblPTR,但返回& hashArray;它有一个完全不同的类型,它是一个指向TblPTR数组的指针。

该功能应该是

TblPTR *createHashTBL(int size) {

 ... 
 TblPTR *hashArray = malloc(size * sizeof *hashArray);
 ..

 return hashArray;
}

(记得在你完成时释放()元素和hashArray)

答案 3 :(得分:0)

您有两个主要问题:

  1. 表达式&hashArray的类型为TblPTR (*)[size](指向size的指针 - TblPTR的元素数组),而不是TblPTR;这就是你的类型不匹配警告的来源。但是,......

  2. hashArray是函数的本地;函数退出后,hashArray不再有效,因此您将返回指向垃圾的指针。

  3. VLA不适合在此使用。我建议进行以下更改:

    TblPTR *createHashArray(size)       // return a pointer to TblPTR
    {
      ...
      TblPTR *hashArray = malloc(sizeof *hashArray * size);
      if (hashArray)
      {
        // initialize hash array as you're currently doing
      }
      return hashArray;
    }
    

    请注意,您必须稍后在代码中free()数组。