在 C 中取消引用‘void *’指针
dereferencing ‘void *’ pointer in C
所以我在 .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;
我错过了什么?我真的迷失了语法。
让我们看看这些行:
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);
所以我在 .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;
我错过了什么?我真的迷失了语法。
让我们看看这些行:
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);