在C中解除引用'void *'指针

时间:2016-10-06 19:03:31

标签: c void-pointers dereference

所以我有一些.h

stable.h

// The symbol table.
typedef struct stable_s *SymbolTable;

// Data stored.
typedef union {
  int i;
  char *str;
  void *p;
} EntryData;

// Return struct for stable_insert.
typedef struct {
  int new;  // Was a new entry created?
  EntryData *data;  // Data associated with entry.
} InsertionResult;

etc

然后在我的.c

stable.c

etc

typedef struct {
    char *key;
    EntryData data;
} Entry;

struct stable_s { /* Indice hash */
    char index;
    int size;
    void *pointer;
};

etc

EntryData *stable_find(SymbolTable table, const char *key){
    int k;
    char c;

    if (key[0] >= 'A' && key[0] <= 'Z')
        c = table[(key[0] - 65)].index;
    else if (key[0] >= 'a' && key[0] <= 'z')
        c = table[(key[0] - 141)].index;
    else
        c = table[26].index;

    c -= 65;

    if (table[c].size == 0)
        return NULL;

    k = busca_binaria(table[c].pointer, table[c].size, key);
    if (strcmp(table[c]->pointer[k]->key, key) == 0)
        return table[c]->pointer[k]->data;

    return NULL;
}

gcc -std=c99 stable.c -o stable正在给我这些错误:

stable2.c: In function ‘stable_find’:
stable2.c:128:24: error: invalid type argument of ‘->’ (have ‘struct stable_s’)
 if (strcmp(table[c]->pointer[k]->key, key) == 0) 
stable2.c:129:24: error: invalid type argument of ‘->’ (have ‘struct stable_s’)
     return table[c]->pointer[k]->data;

我错过了什么?我在语法上真的迷失了。

1 个答案:

答案 0 :(得分:0)

让我们看看以下几行:

k = busca_binaria(table[c].pointer, table[c].size, key);
if (strcmp(table[c]->pointer[k]->key, key) == 0)
    return table[c]->pointer[k]->data;

什么是table?它是struct stable_s *

所以

table[c]

struct stable_s - 不是指针。

回到以下几行:

k = busca_binaria(table[c].pointer, table[c].size, key);
                  ^^^^^^^^^^^^^^^^
                  Correct as table[c] is a struct stable_s

if (strcmp(table[c]->pointer[k]->key, key) == 0)
           ^^^^^^^^^^^^^^^^^^^^
           Wrong as table[c] is not a point

    return table[c]->pointer[k]->data;
           ^^^^^^^^^^^^^^^^^^^^
           Wrong as table[c] is not a point

您的代码中似乎存在其他问题(例如解除引用`void *),但上述内容应与编译器错误有关。

也许这一行:

if (strcmp(table[c]->pointer[k]->key, key) == 0)

应该是:

if (strcmp(((Entry*)table[c].pointer)[k].key, key) == 0)

但是我无法确定您是否发布了告诉我们的代码。

也许这一行:

return table[c]->pointer[k]->data;

应该是:

return &(((Entry*)table[c].pointer)[k].data);