2016-01-16 3 views
1

У меня есть структура, которая выглядит следующим образом:Доступ к Гибкому члену массива в C

typedef struct TestCase TestCase; 
typedef struct TestCase { 
    char * userName; 
    TestCase *c[]; // flexible array member 
} TestCase; 

И в другом файле я пытаюсь установить гибкий элемент массива в NULL, но это, кажется, не работа (я не позволил изменить, как это было определено)

void readIn(FILE * file, TestCase ** t) { 
    *t = malloc(sizeof(TestCase)); 

    (*t)->c = NULL; //gives the error 

} 

Я использую двойные указатели, потому что это то, что было указано для меня (это не весь код, а просто snipit). (Так как есть и код позже, чтобы освободить выделенные переменные).

Любая помощь была бы принята с благодарностью.

+1

какая ошибка вы получаете? –

+0

«Недопустимое использование элемента гибкой матрицы» – Geded

+0

см. Это http://stackoverflow.com/questions/28718198/how-to-access-array-of-flexible-arrays-in-cache-friendly-manner – zangw

ответ

5

Посмотрите на этой линии:

(*t)->c = NULL; 

Это пытается присвоить NULL в массив, который не допускается. Было бы желания писать что-то вроде этого:

int array[137]; 
array = NULL; // Not allowed 

Если у вас есть гибкий элемент массива, намерение состоит в том, что когда вы malloc памяти для объекта, вы overallocate памяти вам нужно, чтобы освободить место для элементов массива. Например, этот код

*t = malloc(sizeof(TestCase) + numArrayElems * sizeof(TestCase*)); 

выделит новый TestCase, который имеет массив указателей numArrayElems.

Если вы не знаете заранее, сколько указателей вам нужно, то вам, вероятно, следует отказаться от использования гибких элементов массива и просто использовать обычные указатели.

Смежные вопросы