Malloc i nazwy zmiennych pod sizeof

0

Wezmy pod lupe:
https://pl.wikibooks.org/wiki/C/Wska%C5%BAniki#Obs.C5.82uga_pami.C4.99ci
W przykladowym kodzie korzystamy z zapisku:

(float*) malloc(rozmiar * sizeof(*tablica))

Oto co sugeruje wikipedia:

Teraz rozważmy sytuację, gdy zdecydujemy się zwiększyć dokładność obliczeń i zamiast typu float użyć typu double. Będziemy musieli wyszukać wszystkie wywołania funkcji malloc, calloc i realloc odnoszące się do naszej tablicy i zmieniać wszędzie sizeof(float) na sizeof(double). Aby temu zapobiec lepiej od razu użyć sizeof(tablica), wówczas zmiana typu zmiennej tablica na double zostanie od razu uwzględniona przy alokacji pamięci.

Ale przed malloc mamy zapis:

(float*) malloc

więc i tak nie uchronimy się od tych zmian

Jaki jest zatem tego sens?

1

Generalnie w C nie musisz robić takich wyraźnych castów - w C++ tak, ale w C perfektli walid jest przypisanie double* costam = malloc(...);.
Wtedy sytuacja jest klarowniejsza ;)

1

Lub ewentualnie robisz makro:

#ifdef REAL_DOUBLE 
typedef double real;
#else
typedef float real;
#endif

I wtedy masz:

real *tab = (real *)malloc(rozmiar * sizeof(real));

Ale równie dobrze jak wyżej wspomniano castowanie w C chyba można olać.

2

Ten post kiedyś skutecznie oduczył mnie castowania malloca w C...
http://stackoverflow.com/questions/7545365/why-does-this-code-segfault-on-64-bit-architecture-but-work-fine-on-32-bit

EDIT:

Jak się mylę to niech mnie ktoś poprawi, ale w C++ nie można tego opędzić tak (jak już musi być ten nieszczęsny malloc)?

a = static_cast<decltype(a)> (malloc(4* sizeof(*a)));

albo

a = static_cast<decltype(a)> (malloc(4* sizeof(std::remove_pointer<decltype(a)>::type)));

(te 4 to jakiś tam przykładowy rozmiar oczywiście)

1 użytkowników online, w tym zalogowanych: 0, gości: 1