How to initialize const members of structs on the heap

前端 未结 4 1972
忘了有多久
忘了有多久 2020-12-12 23:58

I would like to allocate a structure on the heap, initialize it and return a pointer to it from a function. I\'m wondering if there\'s a way for me to initialize const membe

相关标签:
4条回答
  • 2020-12-13 00:44

    Like so:

    ImmutablePoint *make_immutable_point(int x, int y)
    {
      ImmutablePoint init = { .x = x, .y = y };
      ImmutablePoint *p = malloc(sizeof *p);
    
      if (p == NULL) abort();
      memcpy(p, &init, sizeof *p);
    
      return p;
    }
    

    (Note that unlike C++, there is no need to cast the return value of malloc in C, and it is often considered bad form because it can hide other errors).

    0 讨论(0)
  • 2020-12-13 00:44

    I like caf's approach, but this occured to me too

    ImmutablePoint* newImmutablePoint(int x, int y){ 
       struct unconstpoint {
          int x;
          int y;
       } *p = malloc(sizeof(struct unconstpoint));
       if (p) { // guard against malloc failure
          *p.x = x;
          *p.y = y;
       }
       return (ImmutablePoint*)p;
    }
    
    0 讨论(0)
  • 2020-12-13 00:50

    If this is C and not C++, I see no solution other than to subvert the type system.

    ImmutablePoint * make_immutable_point(int x, int y)
    {
      ImmutablePoint *p = malloc(sizeof(ImmutablePoint));
      if (p == NULL) abort();
    
      // this 
      ImmutablePoint temp = {x, y};
      memcpy(p, &temp, sizeof(temp));
    
      // or this
      *(int*)&p->x = x;
      *(int*)&p->y = y;
    
      return p;
    }
    
    0 讨论(0)
  • 2020-12-13 00:58

    If you insist on keeping the const in the structure, you are going to have to do some casting to get around that:

    int *cheat_x = (int *)&p->x;
    *cheat_x = 3;
    
    0 讨论(0)
提交回复
热议问题