我想知道为什么在我的 malloc 之后所有修改都不起作用。 这是我用来说明这一点的代码:
#include <stdio.h>
#include <stdlib.h>
struct Age {
unsigned int age : 16;
unsigned int two : 2;
unsigned int notToBeInitialed: 2;
};
int init(struct Age * p){
p = (struct Age *) malloc( sizeof(struct Age) );
p->age = 5;
return 0;
}
int change(struct Age * p){
p->age = 99;
}
int getValue(struct Age * p){
return p->age;
}
int main(void) {
struct Age test;
init(&test);
printf( "Age.age : %d\n", getValue(&test) ); // gives me 0 , expected 5
change(&test);
printf( "Age.age : %d\n", getValue(&test) ); // gives me 99
return 0;
}
我做错了什么?
感谢您的帮助。
来源:http://www.tutorialspoint.com/cprogramming/c_bit_fields.htm 爱迪生:https://ideone.com/O59tqZ
最佳答案
您显然误解了自动存储和动态内存分配之间的区别。
局部变量
struct Age test
使用自动存储定义一个 Age
对象。
您无需执行任何其他操作,此对象已存在并且现在可用。声明此类对象的唯一缺点是它们存在于整个声明范围内。
您不应在此对象上调用 init(至少不是 malloc 部分),因为它已经初始化,只需使用 test.age
设置它的值即可。
以下将按预期工作:
int main(void) {
struct Age test;
test.age = 5;
printf( "Age.age : %d\n", getValue(&test) );
change(&test);
printf( "Age.age : %d\n", getValue(&test) );
return 0;
}
动态内存分配
另一方面,以下内容:
p = (struct Age *) malloc( sizeof(struct Age) );
使用动态内存分配。
分配新内存,然后返回一个指针给你。
在这种情况下,您决定使用此内存来保存 Age
对象。
int init(struct Age ** p){
*p = (struct Age *) malloc( sizeof(struct Age) );
(*p)->age = 5;
}
int main(void) {
struct Age * test;
init(&test)
printf( "Age.age : %d\n", getValue(test) );
change(test);
printf( "Age.age : %d\n", getValue(test) );
return 0;
}
总结
这两种方法是互斥的。当您创建局部变量时,没有必要为其分配额外的内存。
关于C - 初始化时未修改位字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46507051/