C - Загрузка структуры, содержащей указатель на указатель - PullRequest
4 голосов
/ 26 июля 2011

Появляется предупреждение о несовместимости:

#include <stdlib.h>
#include <stdio.h>

typedef struct
{
  int key;
  int data;
  struct htData_* next;
  struct htData_* prev;
}htData_;

typedef struct
{
  int num_entries;
  struct htData_** entries;
}ht_;

ht_* new_ht(int num_entries);
int ht_add(ht_* ht_p, int key, int data);

int main()
{
  int num_entries = 20;
  //crate a hash table and corresponding reference                                                                                                              
  ht_* ht_p = new_ht(num_entries);
  //add data to the hash table                                                                                                                                  
  int key = 1305;
  ht_add(ht_p,key%num_entries,20);

  return 0;
}

ht_* new_ht(int num_entries)
{
  ht_ *ht_p;
  ht_ ht;
  ht.num_entries = num_entries;
  ht_p = &ht;

  //create an array of htData                                                                                                                                   
  htData_ *htDataArray;
  htDataArray = (htData_*) malloc(num_entries * sizeof(htData_));
  //point to the pointer that points to the first element in the array                                                                                          
  ht.entries = &htDataArray; // WARNING HERE!!!!!!!!!!!!!!!!

  return ht_p;
}

Я пытаюсь скопировать **ptr в struct, содержащий **ptr.

Обновление: Мой упрощенный код не был точным, поэтому я опубликовал действительный код.

Ответы [ 2 ]

4 голосов
/ 26 июля 2011

Проблема в том, что struct htData_ и htData_ не - это одно и то же! Что касается компилятора, struct htData_ не существует - это неполный тип. htData_, с другой стороны, является typedef для анонимной структуры. Для более подробного анализа см. Разница между struct и typedef struct в C ++ .

Итак, вы получаете предупреждение, потому что ht.entries объявлен как тип struct htData_**, но правая часть этого назначения имеет тип <anonymous struct>**. Чтобы это исправить, вам нужно определить struct htData_:

typedef struct htData_
{
    ...
} htData_;
1 голос
/ 26 июля 2011

Эта строка неверна:

htData_ array[20] = htDataArray;

Невозможно назначить указатель на массив.

В отредактированном коде есть проблемная строка:

//point to the pointer that points to the first element in the array                                                                                          
  ht.entries = &htDataArray;

На самом деле, синтаксически это правильно, поэтому не должно давать предупреждения.Но вы делаете неправильные вещи здесь.Если вы хотите, чтобы ht.entries указывал на первый элемент массива, вам нужно объявить его как

htData_* entries;  // 'struct' keyword not needed ahead of declaration

и назначить его как

ht.entries = &htDataArray[0];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...