C - 初始化时未修改位字段

标签 c field bit bit-fields

我想知道为什么在我的 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/

相关文章:

javascript - 如何在Symfony2中通过javascript访问html twig表单字段值?

c++ - InDev 基于位的加密程序中未知的 C++ 堆损坏,C++ 编程的新手

c - 用 8 位表示 2 个数字

float 和 double 变量的比较

c - 无法更改 C 中字符串最后一个索引的内容?

mysql - 从文本文件中的术语列表创建 MySQL 表

java - 当我在类的构造函数中声明并初始化字段时,为什么我的字段被初始化为 null 或默认值零?

c - 调试代码将我带到 stdio.h lib

c++ - 是否有一个用于位操作的(C/C++)库?

java - Java如何计算负数?