我有:
typedef struct table {
int size;
} Table;
所以我有一个方法参数:
Table **table
但是当我这样做时:
table->size = 5;
OR:
*table->size = 5;
它不起作用,我的标志给了我错误:请求成员'大小'的东西不是结构或联合
请帮忙。
答案 0 :(得分:4)
为了避免所有奇怪的间接,使用局部变量更容易并且去:
void myfunc(Table ** my_table) {
Table * ptable = *my_table;
ptable->size = 5;
/* etc */
}
但正如其他人所指出的那样,(*table)->size = 5
之类的东西会做同样的事情。
如果你需要修改指向的内容,那么:
void myfunc(Table ** my_table) {
Table * ptable = malloc(sizeof(*ptable));
/* Do stuff with new table, then update argument */
*my_table = ptable;
}
以下是后者的一个例子:
#include <stdio.h>
#include <stdlib.h>
typedef struct table {
int size;
} Table;
int create_table(Table ** table, int size) {
Table * new_table = malloc(sizeof(*new_table));
if ( new_table == NULL ) {
return -1;
}
new_table->size = size;
*table = new_table;
return 0;
}
int main(void) {
Table * my_table;
if ( create_table(&my_table, 5) == -1 ) {
fprintf(stderr, "Couldn't allocate memory for new table.\n");
return EXIT_FAILURE;
}
printf("New table size is %d\n", my_table->size);
free(my_table);
return 0;
}
你可以,当然,只有create_table()
向新创建的表返回Table *
,但在你的情况下,该函数已被声明为返回{{ 1}}。可能有多种原因,但在上面我只是假设它返回一个错误代码。我们知道,C中的函数只能返回一个值,所以如果它返回int
它也不能返回int
,所以获取新指针的唯一方法是修改一个参数,如果你想修改Table *
,你必须传递Table *
的地址,所以你的函数必须接受Table *
。
答案 1 :(得分:2)
取消引用运算符(*
)的优先级较低,因此:
*table->size
评估为:
*(table->size)
由于table
是指向指针的指针,而指针不能包含成员,因此会出现错误。你需要的是:
(*table)->size = 5;
现在,首先评估*table
,产生指向Table
的指针。然后可以将->
应用于它。
相依:
我注意到您对结构名称及其typedef使用不同的标识符。这不是必需的。你可以使用:
typedef struct Table {
int size;
} Table;
答案 2 :(得分:0)
如果使用table_t **mytable
做(*mytable)->size = 5;
如果使用table_t *mytable
做mytable->size = 5;
typedef struct /* table */ {
int size;
} table_t; //conventional naming
int main() {
table_t *mytable = malloc((sizeof *mytable)); //avoid "Access Violation", by allocating memory
mytable->size = 5; //set size to '5'
return 0; //conventional return
}