Member 14702474 Ответов: 4

Что означает (int*)malloc?


привет всем, я столкнулся с проблемой на языке Си, когда пытался использовать функцию malloc.
обычно мы используем malloc в этой форме :

инт* а=(инт*)Танос(4*оператор sizeof(тип int)) ;

но что если я напишу его в таком виде :

типа char* б=(инт*)Танос(оператор sizeof(тип int)*4) ;

возможно ли это? если да,то что это значит?

Что я уже пробовал:

char* b=(int*)malloc(sizeof(int)*4) ;

F-ES Sitecore

Почему бы тебе не попробовать и не выяснить это?

4 Ответов

Рейтинг:
30

OriginalGriff

malloc это функция, которая возвращает блок непрерывного размера памяти - в байтах - который вы запросили.
Так malloc(sizeof(int)*4) выделяет и возвращает блок (вероятно) 16 байт.
Но... он не "знает", для какого типа памяти вы хотите его использовать, поэтому всегда возвращает его как "указатель на ничто" - a void* указатель. Он выравнивается для "подходящего размера" обычно с помощью определения C / C++ max_align_t потому что целые числа и тому подобное обычно должны находиться на другой границе памяти, чем отдельные символы.

Бросание (int*) это просто явное изменение void * возвращает значение "полезного" указателя, которое вы можете без проблем присвоить символу*, хотя и можете получить предупреждение компилятора.
Я бы посоветовал вам написать

char* b=(int*)malloc(sizeof(int)*4) ;
Как
char* b = (char*)malloc(sizeof(int)*4);
Вместо.


Stefan_Lang

Не хочешь ли ты сказать
char* b = (char*)malloc)(sizeof(char)*4);
?

Конечно, это другой смысл, но я нахожу, что другая версия выглядит скорее ... вряд ли ;-)

OriginalGriff

Я так не думаю: если вы выделяете четыре int, то, возможно, захотите передать их как неподписанные символы через последовательный порт - выделение 4 символов может вызвать проблемы.

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

Рейтинг:
19

Richard MacCutchan

Ответ находится в документации: аналог Майкрософт документы[^].


Рейтинг:
0

CPallini

Цитата:
типа char* б=(инт*)Танос(оператор sizeof(тип int)*4) ;
Да, это возможно, хотя компилятор, возможно, предупредит.

Это значит::
  • Выделите память для 4 целых чисел.
  • Явное приведение возвращаемого значения к "указатель на int".
  • Брошенный снова, на этот раз неявно, 'указатель на int' к "указатель на чар" прежде чем назначить его переменной b.
Другими словами, чепуха.


Пожалуйста, обратите внимание, что единственное "хорошо сформированное" заявление-это
int* a=(int*)malloc(4*sizeof(int));

мероприятия, предлагаемые
Цитата:
char* b=(char*)malloc(4*sizeof(int)) ;
хотя он синтаксически корректен, он вводит в заблуждение и должен быть сильно прокомментирован, чтобы четко указать его причину, если таковая имеется.


Рейтинг:
0

Rick York

Я думаю, что другие посты довольно хорошо освещали ситуацию. Рискуя целиться поверх вашей головы, я хотел бы поделиться небольшим макросом, который использую, когда я иметь чтобы использовать alloc/calloc :

// allocate memory of a given type - must use free to release it

#define AllocateMemory(count,type)    (type*)calloc(count,sizeof(type))

// usage example : allocate some integers

int * pIntArray = AllocateMemory( 4, int );
При этом используется calloc, поскольку он обнуляет выделенный блок памяти. Преимущество использования этого метода заключается в том, что не требуется никакого литья. Я думаю, что это значительно упрощает дело.