Массив произвольной длины в структуре

Тема в разделе "LANGS.C", создана пользователем Quark, 13 ноя 2007.

  1. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    описываю структуру

    Код (Text):
    1. typedef struct _XX
    2. {
    3. int a;
    4. int b;
    5. ..
    6. double Mass[0];
    7. }XX,*PXX;
    вообще размер Mass может быть любым (память под структуру выделяется динамически, в зависимости от размера массива). корректно ли в данной ситуации писать Mass[0]? в этом случае компилятор выдаёт предупреждение, что мне не очень нравится.

    warning C4200: nonstandard extension used : zero-sized array in struct/union
    Cannot generate copy-ctor or copy-assignment operator when UDT contains a zero-sized array

    или лучше указывать Mass[1]? смотрел аналогичные структуры в ДДК. там описано как Mass[1]. но в этом случае не совсем удобно выделять память. приходится извращаться, что делает код не красивым.

    PXX pxx = LocalAlloc(0,sizeof(XX)+NumElements*sizeof(double)-sizeof(double));
     
  2. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Код (Text):
    1. double* Mass;
    чем не нравится?
     
  3. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    микрософт любит делать mass[1] =)))
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    По поводу массивов нулевой длины распространялся kaspersky не так давно. Но вообще, обычно используют #3, если данные идут "следом" за структурой, а структура может быть переменной длины, или #2, если структура должна быть фиксированной длины, а данные могут располагаться где угодно.
     
  5. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    размер стр-ры будет больше на размер указателя. по идее надо, чтобы размер стр-ры был равен размеру без массива.

    хорошо. а если всё-таки определить массив нулевой длины и сделать:
    Код (Text):
    1. #pragma warning(disable:4200) // массив нулевой длины
    2.  
    3. typedef struct
    4. {
    5. . . .
    6. };
    7. #pragma warning(default:4200)
    На сколько это корректно?
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    PXX pxx = HeapAlloc(GetProcessHeap(), 0, sizeof(XX) + (NumElements-1)*sizeof(double));
     
  7. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Это??
    Код (Text):
    1. typedef struct _XX
    2. {
    3. int a;
    4. int b;
    5. ..
    6. double Mass[];
    7. }XX,*PXX;
     
  8. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    cppasm
    Ты гений.
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    затыкать рот компилятору полюбому нехорошо)
    хотя иногда без этого не обойтись
     
  10. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Не понял, в каком смысле?
    Или в прямом :) Вроди ведь работает всё, и даже так как надо.
    Код (Text):
    1. struct
    2.  {
    3.    int x;
    4.    int mass[];
    5.  }Z;
    sizeof(Z)=4;
    Или я вопрос не так понял?
     
  11. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    cppasm
    От я и говорю - ты гений.

    Стало быть, ms использует array[1] только для совместимости со стандартным (!) си, от которого всё равно толку не будет, ибо psdk не компилируется при отключении ms specific расширений С. Т.о., array[] рулит.
     
  12. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Скорее наверное для совместимости с ANSI C.
    Я такую штуку как раз в программах на чистом С использую, и компилятор именно сишный, без плюсов (не MS).
    Всё работает на ура.
    PS: я просто подумал ты издеваешся, т.к. вроди ничего оч умного я не сказал ;)