Как привести int указатель к плавающему указателю - PullRequest
0 голосов
/ 29 января 2020

Я запускаю cppcheck (c ++ 11) для библиотеки, которая содержит много приведений, подобных приведенным ниже:

// Allocates various buffers
int*   i_buffer = (int*)   calloc (500, sizeof (int));
float* f_buffer = (float*) i_buffer;

Для этих приведений я вижу следующее сообщение:

"portability", "invalidPointerCast", "Приведение между целым числом * и числом с плавающей точкой *, которые имеют несовместимое представление двоичных данных."

Как правильно выполнить приведенный выше тип приведения? Каково потенциальное последствие приведения указателя так, как показано выше?

Ответы [ 3 ]

2 голосов
/ 29 января 2020

Как привести int указатель к плавающему указателю

Использование переинтерпретации приведения.

Но не пытайтесь сделать это, потому что переинтерпретированный указатель не будет полезно.

Как правильно выполнить приведенный выше тип приведений?

Показанный состав уже четко определен; это просто бесполезно делать такое приведение.

Если вам нужно выделить массив с плавающей точкой, вы можете использовать следующее:

std::vector<float>(500);
1 голос
/ 29 января 2020

Строго говоря, поведение вашего кода не определено из-за нарушения строгого алиасинга .

На практике, если int и float имеют одинаковый размер (они включены на многих настольных платформах, хотя для переноса int в 64-битный режим требуется некоторое количество *1003*, код будет работать без ошибок. Хотя, повторюсь, с точки зрения стандартного C ++ это абсолютно не гарантировано.

Но вам все равно следует это исправить. Выделение массива float напрямую - разумная вещь:

float* f_buffer = (float*) calloc (500, sizeof (float));
0 голосов
/ 29 января 2020

Также допустимо использовать массив старого стиля C по новому (который является стандартом C ++):

float* f_buffer = new float[500];

Имейте в виду, чтобы адаптировать высвобождение этой памяти к:

delete [] f_buffer;

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

...