2015-06-30 4 views
-3

У меня есть код содержит эту структуруИзменение размера структуры после объявленного

struct mystruct{ 
    int a; 
    int array[1]; 
}; 

Непосредственно после запуска кода Я имею в виду не буду объявлять любые переменный эту структуру, пользователь будет вводить номер, например, 6. Я хочу знать, как я могу изменить размер этой структуры.

Как я заявил в этой форме

struct mystruct{ 
    int a; 
    int array[6]; 
}; 

Затем я использую обычно, как это:

struct mystruct var; 
//I do not want to add any code here, to appropriate new form 
for(int i=0;i<6;i++) 
    var.array[i]=0; 
+0

'int array [];' then create by malloc в C99. – BLUEPIXY

+0

Я не хочу резервировать каждый раз, когда я объявляю новую переменную – MouhcineFD

+0

. Ваше желание не будет получено в C. – BLUEPIXY

ответ

0

Вы не можете изменить уже объявленную-структуру, но вы можете сделать новую, как вы хотите путем изменения программы. Вы не можете изменять структуры данных, используемые в программе «на лету» во время ее работы.

+0

Я сказал «Непосредственно после запуска кода я имею в виду, что я не буду объявлять какую-либо переменную этой структуры» + Как я могу создать новый, и программа работает – MouhcineFD

0

Вы не можете изменить объявление структуры, но если это массив переменной длины внутри структуры, которую вы хотите, у вас есть опция. Объявить свой-структуру, как:

struct mystruct{ 
    int a; 
    int array[0]; 
}; 

И тогда, когда вы хотите создать экземпляр с n элементов в массиве необходимо выполнить следующие действия:

struct mystruct *a = malloc(sizeof(struct mystruct) + n * sizeof(int)); 

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

a->array[1] = 5; 

(этот пример предполагает массив имеет по крайней мере 2 элемента)

сделать то, что у вас есть в вашем примере кода вы хотите сделать что-то вроде этого:

struct mystruct *var = malloc(sizeof(struct mystruct) + 6 * sizeof(int)); 
for(int i=0;i<6;i++) { 
    var->array[i]=0; 
} 
+0

Я думаю, что это проще создать объект-мишень в стеке, а затем malloc просто элемент «array». Но это сработает. –

+0

@ DanKorn Это очень распространенный подход, см. Http://lxr.free-electrons.com/source/include/linux/usb.h#L1446 – missimer

+0

Это может быть общий подход. Но я думаю, что ссылка, которую вы опубликовали, действительно поддерживает мой способ сделать это. Единственная ссылка на malloc() в нем есть о члене transfer_buffer, и комментарий говорит malloc() только этому члену, а затем устанавливает член transfer_buffer_length для соответствия. Там нет ничего, что подсказывает ваш подход использования malloc() для создания более крупного struct urb. –

1

типичный способ сделать что-то подобное в прямой C (в отличие от C++) должен иметь только элемент указателя в структуры, чтобы указать на массив, а затем еще один член структуры, чтобы указать размер. Обычно это требует от пользователей структуры malloc() массива по мере необходимости, а также для указания члена размера. Что-то вроде:

struct mystruct 
{ 
    int size; 
    int *array; 
}; 

и:

struct mystruct var; 
var.array = malloc(6 * sizeof(int)); 
var.size = 6; 

for (int i = 0; i < var.size; i++) 
    var.array[i] = 0; 

Другая общая парадигма является linked list.

Конечно, на C++ вы можете просто использовать std::vector<int>.

+0

Я сказал struct mystruct var; // ************* Я не хочу добавлять код здесь, для соответствующей новой формы для (int i = 0; i <6; i ++) var.array [i ] = 0; – MouhcineFD

+1

Я понимаю, что вы ХОТИТЕ сделать, но вы должны что-то сделать. –

+0

в вашем подходе, 'int array [];' должен быть 'int * array;' [Test code] (http://ideone.com/ekwSHd) – BLUEPIXY

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