Потому что арифметика указателей работает в единицах указанного типа. Например:
int* p_num = malloc(10 * sizeof(int));
int* p_num2 = p_num + 5;
Здесь p_num2
не указывает пять байт за p_num
, оно указывает пять целых за p_num
. Если на вашей машине целое число имеет ширину четыре байта, адрес, сохраненный в p_num2
, будет на двадцать байтов больше, чем в p_num
. Причина этого в основном в том, что указатели могут быть проиндексированы как массивы. p_num[5]
в точности эквивалентно *(p_num + 5)
, поэтому арифметика указателей не имеет смысла всегда работать в байтах, иначе p_num[5]
даст вам некоторые данные, которые начинаются в середине второго целого числа, а не даст вам шестое целое число, как и следовало ожидать.
Чтобы переместить определенное число байтов за указатель, вам необходимо привести указатель в тип, который гарантированно будет иметь ширину ровно 1 байт (char
).
Также у вас есть ошибка здесь:
printf("\nSIZE : [%d]\nSIZE : [%d]\n", size);
У вас есть два спецификатора формата, но только один аргумент после строки формата.