开发者

C - Loading a Struct Containing a Pointer to a Pointer

This produces an incompatibility warning:

#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)
{
  开发者_如何学Cht_ *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;
}

I'm trying to copy the **ptr to the struct containing a **ptr.

Update: My simplified code was not accurate so I've posted the actual code.


The problem is that struct htData_ and htData_ are not the same thing! As far as the compiler is concerned, struct htData_ doesn't exist—it's an incomplete type. htData_, on the other hand, is a typedef for an anonymous structure. For a more detailed analysis, see Difference between struct and typedef struct in C++.

So, you're getting a warning because ht.entries is declared as the type struct htData_**, but the right-hand side of that assignment has type <anonymous struct>**. To fix this, you need to define struct htData_:

typedef struct htData_
{
    ...
} htData_;


This line is not proper:

htData_ array[20] = htDataArray;

You cannot assign a pointer to an array.

In your edited code, here is the problematic line:

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

Actually, syntactically it's correct, so it should not give warning. But you are doing wrong stuff here. If you want ht.entries pointing to the first element of array than you need to declare it as,

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

and assign it as,

ht.entries = &htDataArray[0];
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜