Значение присвоения размера во время выделения памяти в Malloc

У меня есть указатель типа double, который указывает на выделенную память с помощью malloc, где я выделил 12 элементов в массиве:

double *y = (double*)malloc(sizeof(double) *  12); 

Мой вопрос заключается в следующем. Скажем, я выделил память таким образом:

double *y2 = (double*)malloc(sizeof(double*) *  12); 

Какая разница, если добавить * к двойному размеру скобки? Есть ли смысл в таком изменении? Я рассчитываю размер указателя на двойной, а не размер двойного? Я задаю такой вопрос, потому что, когда я пришел к вычислению fabs y2[0] и сказал, что y2[0] был равен -0,02, ответ был 0,00, тогда как когда я вычислил ответ fabs y1[0] и y1[ 0] был равен -0,02, ответ был 0,02.


person Anthony    schedule 26.07.2018    source источник


Ответы (1)


sizeof (double) соответствует размеру элемента массива из double значений. sizeof (double *) будет правильным значением для массива указателей на double.

В большинстве 64-битных архитектур и sizeof (double), и sizeof (double *) оказываются равными 8, но в большинстве 32-битных архитектур sizeof (double) равно 8, а sizeof (double *) равно 4, поэтому есть разница.

Если вы получаете разные результаты с sizeof (double *), это, вероятно, потому, что ваше выделение слишком мало, и в результате вы столкнулись с переполнением буфера кучи и повреждением памяти.

person Florian Weimer    schedule 26.07.2018
comment
Благодарю вас! Я действительно ценю ваш ответ :) - person Anthony; 31.07.2018