我创建了一个存储整数的结构,然后在方法中将整数设置为一个值。但是,当我尝试使用任何其他方法访问该值时,我给出了一个不大的值。
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);
}
答案 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
}