在C中取消引用结构的字段

时间:2013-10-27 01:15:46

标签: c data-structures struct dereference

我有:

typedef struct table {

int size;

} Table;

所以我有一个方法参数:

Table **table

但是当我这样做时:

table->size = 5;

OR:

*table->size = 5;

它不起作用,我的标志给了我错误:请求成员'大小'的东西不是结构或联合

请帮忙。

3 个答案:

答案 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 *mytablemytable->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
}