Malloc со структурами в C

У меня есть структура:

struct numbers_struct {
char numbers_array[1000];
};

struct numbers_struct numbers[some_size];

После создания структуры на вход подается целое число:

scanf("%d",&size);

Мне нужно использовать malloc(size) и указать размер чисел массива. (вместо some_size используйте размер)

Возможно ли что-то подобное в C?


person Jack Jackson    schedule 12.10.2012    source источник
comment
В C нет VLA, лучше использовать calloc   -  person perilbrain    schedule 12.10.2012
comment
@perilbrain: Что у всех с calloc? Единственное практическое отличие от malloc заключается в том, что он инициализирует память.   -  person Jan Hudec    schedule 12.10.2012
comment
@JanHudec: - а как насчет массива???   -  person perilbrain    schedule 12.10.2012
comment
@perilbrain: Нет, в C нет массивов переменной длины. Но в вопросе уже упоминается malloc.   -  person Jan Hudec    schedule 12.10.2012
comment
@JanHudec, VLA были представлены в C99.   -  person hmjd    schedule 12.10.2012
comment
@hmjd: На самом деле я хотел упомянуть, что при некоторых ограниченных условиях они есть, но подумал, что это будет слишком усложнять вопрос.   -  person Jan Hudec    schedule 12.10.2012


Ответы (5)


Может быть, вы можете сделать так

 struct numbers_struct {
char numbers_array[1000];
};

scanf("%d",&size);

struct numbers_struct *numbers = malloc(sizeof(numbers_struct) * size);
person anand    schedule 12.10.2012
comment
Если это чистый C, вам нужно написать sizeof(struct numbers_struct). Имена структур автоматически typedef только в C++. Или вам нужно создать typedef в c при определении структуры - person fkl; 12.10.2012

Да, но malloc() требуется общий объем памяти, необходимый для массива, а не количество элементов:

struct numbers_struct* numbers = malloc(size * sizeof(*numbers));
if (numbers)
{
}

Обратите внимание, что вы должны проверить возвращаемое значение scanf() перед использованием size (в данном случае это плохое имя), иначе в коде может использоваться неинициализированная переменная, если scanf() не работает:

int number_of_elements;
if (1 == scanf("%d", &number_of_elements))
{
    struct numbers_struct* numbers =
        malloc(number_of_elements * sizeof(*numbers));
    if (numbers)
    {
        free(numbers); /* Remember to release allocated memory
                          when no longer required. */
    }
}

Массивы переменной длины были введены в C99, но существуют ограничения на их использование (например, их нельзя использовать в области файла).

person hmjd    schedule 12.10.2012

См. использование «calloc», «alloc» и «realloc» в документации.

person nicephotog    schedule 12.10.2012
comment
Что у всех с calloc? Единственное практическое отличие от malloc заключается в том, что он инициализирует память. - person Jan Hudec; 12.10.2012
comment
@JanHudec: №1: иногда бывает полезна инициализация. #2: Удобочитаемость — это дает понять, что вы выделяете N элементов размера S. #3: malloc(n*m) ведет себя странно, если n*m переполняется, а calloc(n,m) нормально не работает. - person ugoren; 12.10.2012

VLA возможен в C99.

ты можешь это сделать

int main()
{
char *p;//I have used char you can use any pointer
int k;
scanf("%d",&k);
p=malloc(k);//just allocated the memory and given the  memory address to p

//after use 
free(p);
}

Он скомпилируется без ошибок.

person pradipta    schedule 12.10.2012

person    schedule
comment
Не нужно приводить результат malloc. - person Alex Reynolds; 12.10.2012