What is the cause of flexible array member not at end of struct error?

后端 未结 3 1884
南方客
南方客 2020-12-14 07:04

I am wondering why I keep getting error: flexible array member not at end of struct error when I call malloc. I have a struct with a variable length array, and

相关标签:
3条回答
  • 2020-12-14 07:35

    Given a struct definition and a pointer to the start of a struct, it is necessary that the C compiler be able to access any member of the struct without having to access anything else. Since the location of each item within the structure is determined by the number and types of items preceding it, accessing any item requires that the number and types of all preceding items be known. In the particular case where the last item is an array, this poses no particular difficulty since accessing an item in an array requires knowing where it starts (which requires knowing the number and type of preceding items, rather than the number of items in the array itself), and the item index (which the compiler may assume to be smaller than the number of items for which space exists, without having to know anything about the array size). If a Flexible Array Member appeared anywhere other than at the end of a struct, though, the location of any items which followed it would depend upon the number of items in the array--something the compiler isn't going to know.

    0 讨论(0)
  • 2020-12-14 07:42

    You can only have one flexible array member in a struct, and it must always be the last member of the struct. In other words, in this case you've gone wrong before you call malloc, to the point that there's really no way to call malloc correctly for this struct.

    To do what you seem to want (arrays of the same number of data and label members), you could consider something like:

    struct my_pair { 
        double data;
        int label;
    };
    
    typedef struct { 
       size_t N;
       struct my_pair data_label[];
    };
    

    Note that this is somewhat different though: instead of an array of doubles followed by an array of ints, it gives you an array of one double followed by one int, then the next double, next int, and so on. Whether this is close enough to the same or not will depend on how you're using the data (e.g., for passing to an external function that expects a contiguous array, you'll probably have to do things differently).

    0 讨论(0)
  • 2020-12-14 07:46
    typedef struct {
      size_t N;
      double data[];
      int label[];
    } s_col; 
    

    You can't have flexible array member (double data[]) in the middle. Consider hardcoded array size or double *data

    0 讨论(0)
提交回复
热议问题