2010-12-08 4 views
0

Я пытаюсь разрешить массив переменной длины внутри структуры в программе на языке C. Что-то вроде этого:Инициализация массива внутри структуры в C

как это сделать?

даже следующее определение будет делать:

struct result{ 
    int column; 
    int row; 
    const char* a[row][column]; 
}; 

вписатьтся действительно помогают ...

+0

Какая у вас проблема? – Sudantha 2010-12-08 08:39:28

ответ

2

Вы не можете иметь массивы переменного размера в структурах C.

Вы можете иметь указатели на массивы, которые могут быть переменным размером (вам нужно обрабатывать распределение пространства отдельно), но вы объявляете массивы указателей вместо

Если вы хотите массив указателей, попробуйте

const char (*a)[][]; 

(вам нужно управлять массивом как массив указателей на массивы, если вы хотите, чтобы оба размеры, чтобы быть переменными)

1

Использование динамического распределения с функцией таНос.

В вашем случае вы должны сделать что-то вроде:

#include <stdlib.h> /* header file for the malloc function */ 

void allocateResult(struct result* res, int row, int column) { 
    res->a = (const char*) malloc(row * column * sizeof(char)); 
} 

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

Это решение подразумевает бесплатную выделенную память до окончания программы. Вы должны будете передать указатель в вашей структуре, чтобы бесплатно:

void freeResult(struct result* res) { 
    free(res->a); 
} 
+0

Могу ли вы дать мне пример .. как я havin трудно визуализировать вещь. – 2010-12-08 08:42:19

+0

Вот он, не стесняйтесь комментировать еще раз, если вам нужно больше деталей. – jopasserat 2010-12-08 08:44:05

1

для одного измерения массивов вы можете сделать что-то вроде этого:

struct TEST { 
    ... 
    int size; 
    char string[]; 
} 

где поле размера указывает, сколько символов в массиве строк. Массив должен быть последним членом структуры, и вы должны динамически распределять память структуры. В этом случае выделенный размер должен быть sizeof(struct TEST) + size * sizeof(char).

В структуре не может быть больше одного массива переменных. Многомерные массивы переменного размера сложнее. Это невозможно, если только один размер не известен, в частности, размер первого измерения.

struct TEST { 
    ... 
    int size; 
    char string[][100]; 
} 

EDIT:

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

EDIT 2:

Это часть, по меньшей мере, со стандартом ISO C99. Бесстыдно копировать из пункта 6.7.2.1, подпункт 16:

16 В особом случае, последний элемент структуры с более чем одним именем элемента может иметь неполный тип массива; это называется гибким элементом массива . С двумя исключениями, , элемент гибкого массива игнорируется. Во-первых, размер структуры должна быть равна смещению последнего элемента другой идентичной структуры, которая заменяет гибкий элемент массива с массивом неустановленный length.106) ...

2

Просто используйте указатели вместо этого. Вам придется выполнять динамическое распределение памяти. Не забудьте освободить() память, выделенную для вашего массива :)

PS: Если вам нужен 2-мерный массив, используйте указатель на указатель (то есть выделите память для массива указателей)

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