Выделение памяти (calloc, malloc) для unsigned int

Для моего приложения C я попытался инициализировать память. Я знаю о более медленном calloc, но, к счастью, нет необходимости отслеживать производительность.

Мне нужно место в памяти только для одного элемента int без знака (до 65535).

Это часть моего кода, которая не работает:

//Declaration
unsigned int part1;

//Allocation
part1 = (unsigned int) calloc (1,sizeof(unsigned int));

Это выдает предупреждение компилятора:

предупреждение: преобразование из указателя в целое число другого размера [-Wpointer-to-int-cast]

Почему приведенный выше код не работает, где...

unsigned long size;
size =(unsigned long) calloc (1,sizeof(unsigned long));

...прекрасно работает?

Спасибо!


person user1252280    schedule 23.12.2013    source источник
comment
Здесь вам не нужно выделение памяти в куче. Вы уже объявили part1 в памяти стека.   -  person Abhineet    schedule 23.12.2013


Ответы (3)


calloc возвращает void*, поэтому вы должны использовать его как

unsigned int* part1 = calloc (1,sizeof(*part1));

затем назначьте его как

*part1 = 42;

Если вы выделили место для нескольких элементов

part1[0] = 42; // valid indices are [0..nmemb-1]

может быть понятнее.

Обратите внимание, что вам также придется free эту память позже

free(part1);

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

unsigned int part1 = 42;

Относительно того, почему приведение точки к unsigned long не генерирует предупреждение, sizeof(void*)==sizeof(unsigned long) на вашей платформе. Ваш код не будет переносимым, если вы полагаетесь на это. Что еще более важно, если вы используете указатель для хранения одного целого числа, вы потеряете только что выделенную память и не сможете хранить более одного элемента массива.

person simonc    schedule 23.12.2013
comment
Разве нам не нужно приводить типы? - person Hariprasad; 23.12.2013
comment
@Hariprasad Нет, в C нам не нужно. Прочитайте Можно ли привести результат malloc? - person Grijesh Chauhan; 23.12.2013
comment
Отмечено как правильный ответ. Я знал о возвращении void*, потому что я читал его... но я совершенно новичок в C, и все управление памятью довольно сложно понять. Кроме того: отличный ответ и понятное объяснение моего вопроса о длинной путанице без знака. Спасибо! - person user1252280; 23.12.2013

Используйте код ниже. Calloc() вернет void*, поэтому вам придется преобразовать его в SomeType*

беззнаковое целое* часть1;

//Allocation
part1 = (unsigned int*) calloc (1,sizeof(unsigned int));
person Digital_Reality    schedule 23.12.2013
comment
Преобразование из void* в unsigned int* будет неявным. Вам не нужен актерский состав в C. Подробности см. В комментарии Грижеша к моему ответу. - person simonc; 23.12.2013
comment
О, да! Правильно .. Но OP все равно должен объявить это как указатель на int (какой бы тип ему ни был нужен) - person Digital_Reality; 23.12.2013
comment
c выполняет неявное преобразование void* в любой другой тип указателя. Вы не должны приводить его явно. - person Abhineet; 23.12.2013

вы должны понимать эти типы распределения памяти, чтобы избежать этих ошибок:

Выделение статической памяти:

беззнаковое целое часть1;

Размер фиксированный. Это нужно знать во время компиляции. Освобождение памяти выполняется непосредственно при выходе из области видимости. Переменная размещается в стеке. действительно, этот тип распределения памяти выполняется во время компиляции, его время жизни - это все время выполнения программы. Преимуществом использования этого типа распределения является эффективное время выполнения. но если мы объявляем больше места для статических данных, чем нам нужно, мы тратим место впустую, это недостаток этого типа.

Динамическое выделение памяти:

беззнаковое целое* часть1 = calloc(n, sizeof(беззнаковое целое));

Размер может варьироваться, вы можете найти значение во время выполнения. Вы несете ответственность за освобождение памяти с помощью предопределенной C-функции free(). Переменная размещается в куче.

вы можете увидеть более подробную информацию на веб-сайте: http://www.cs.virginia.edu/~son/cs414.f05/lec11.slides.pdf

person Anis_Stack    schedule 23.12.2013