Возврат указателя на массив указателей на структуры - PullRequest
0 голосов
/ 03 февраля 2011

Итак, у меня небольшая проблема. Я пытаюсь создать хеш-таблицу, но получаю сообщение об ошибке «Возврат из несовместимого типа указателя» Я знаю, что это значит, но я не знаю, почему мой код не работает. Я ищу объяснение того, почему мой код не работает. Почему он не распознает массив как указатель?

Я делаю массив указателей на структуры для хеш-таблицы. (внешне прикованный) (Я знаю, что мой код, вероятно, действительно отстой> <Я все еще учусь!) </p>

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 ]

4 голосов
/ 03 февраля 2011

У вас есть как минимум две проблемы.

Во-первых, ваша функция createHashTBL() определена для возврата объекта TblPTR, и вы возвращаете указатель на массив изTblPTR объектов.Вам следует изменить тип функции, чтобы он соответствовал типу возвращаемого значения, который вы пытаетесь найти, или вернуть правильный тип объекта.

Во-вторых, ваш hashArray размещен в стеке в функции createHashTBL(), что означаетвы не можете вернуть указатель на него.Он исчезнет, ​​когда ваша функция вернется.Вы должны попытаться выделить массив с помощью malloc() или сделать так, чтобы вызывающая сторона указала на предварительно выделенный массив.

2 голосов
/ 03 февраля 2011

TblPTR hashArray[size]; создается в стеке и не может быть возвращен, поскольку ваша переменная будет уничтожена в конце вашей функции.

Вместо этого следует использовать malloc () или static TblPTR hashArray[size]; (не рекомендуется).

И это неправильно:

    return &hashArray;

Вы возвращаете указатель на свой массив: (TblPTR *).Просто сделай

    return hashArray;
0 голосов
/ 03 февраля 2011

У вас есть две основные проблемы:

  1. Тип выражения &hashArray: TblPTR (*)[size] (указатель на size -элементный массив TblPTR), а не TblPTR; вот откуда приходит ваше предупреждение о несоответствии типов. Однако ...

  2. hashArray локально для функции; как только функция закроется, hashArray больше не будет действительным, поэтому вы будете возвращать указатель на мусор.

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() массив в какой-то момент позже в вашем коде.

0 голосов
/ 03 февраля 2011

Ошибка вашего компилятора намекает на то, что это также может быть и другой проблемой, такой как отсутствие typedef. Вы всегда должны копировать / вставлять сообщения об ошибках, чтобы мы могли их проверить, а также указать, в какой строке находится ошибка, в вставляемом коде - это поможет всем понять проблему

Здесь есть некоторые ошибки.

TblPTR createHashTBL(int size) {

 ... 
 TblPTR hashArray[size];
 ..

 return &hashArray;
}
  • Вы не можете вернуть указатель на локальную переменную - эта переменная исчезает, когда функция возвращает
  • объявляется, что createHashTable возвращает TblPTR, но return & hashArray; имеет совершенно другой тип, это указатель на массив TblPTR.

Эта функция, вероятно, должна быть

TblPTR *createHashTBL(int size) {

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

 return hashArray;
}

(Не забудьте free () элементы и hashArray, когда вы закончите с ним)

...