访问struct中的整数变量

时间:2014-04-19 19:04:32

标签: c struct

我创建了一个存储整数的结构,然后在方法中将整数设置为一个值。但是,当我尝试使用任何其他方法访问该值时,我给出了一个不大的值。

typedef struct thing {
    int size;
    arraylist** list; // defined elsewhere
} thing;

// Creates a thing
void create (thing* table) {
    table = (thing *)malloc(sizeof(thing) * 8);
    table->size = 1;
    printf("%d", table->size); // prints 1
}

void another (thing* table) {
    printf("%d", table->size); // prints a large number
}

void main() {
    struct thing a;
    create(&a);
    printf("test: %d", (&a)->size); // prints a random large number, ex. 1667722352
    another(&a);
}

2 个答案:

答案 0 :(得分:1)

您可能想要另一个间接级别:

typedef struct thing {
    int size;
} thing;

// Creates a thing
void create(thing **table) {
    *table = malloc(sizeof(thing) * size); // don't know what size is. 1?
    (*table)->size = 1;
    printf("%d", (*table)->size); // prints 1
}

void another(const thing *table) {
    printf("%d", table->size); // prints a large number
}

void main() {
    struct thing *a;
    create(&a);
    printf("test: %d", a->size); // prints a random large number, ex. 1667722352
    another(a);
}

答案 1 :(得分:1)

您将覆盖堆栈上的变量,稍后会为您提供意外值。

在你的主要功能中,你在堆栈上声明struct thing

void main() {
    struct thing a;  // Stack allocated variable
    create(&a);
    printf("test: %d", (&a)->size); // prints a random large number, ex. 1667722352
    another(&a);
}

所有内存已经存在,但是然后您获取变量的地址并将其传递给其他函数。现在,您将该地址(按值)传递给create,调用malloc并替换该引用。您刚刚分配的地址不是堆栈中对象的地址。并且,因为您实际上没有在堆栈上初始化对象,所以最终会打印出垃圾值。

我不确定你要做什么,但是修复这个确切实例的一种方法是不malloc新内存并只使用堆栈中的内容。< / p>

// Creates a thing
void create (thing* table) {
    // table already has memory
    table->size = 1;
    printf("%d", table->size); // prints 1
}