2017-02-15 10 views
0

Я пытаюсь перераспределить 20 байт в целое число, что уже занимает 10 байт, используя этот код:я неспособен перераспределить память в целое, используя перераспределить в с

#include <stdio.h> 
#include <stdlib.h> 
void main() 
{ 
     int *ptr; 
     ptr=(int *)malloc(10*sizeof(int)); 
     printf("size before re-allocation : %d bytes",sizeof(ptr)); 

     ptr=(int *)realloc(ptr,20*sizeof(int)); 
     printf("size after re-allocation : %d bytes",sizeof(ptr)); 
     free(ptr); 
} 

но вывод показывает 8 байт до realloc и после realloc тоже. что я делаю неправильно?

+0

Вы не можете программно проверить, сколько памяти выделено для чего-то в C, по крайней мере, нет никаких стандартных функций, которые могут это сделать. Вы (программист) должны отслеживать его и должны убедиться, что выделенная память была правильно освобождена, используя 'free' –

+1

' sizeof' - это оператор ** компиляции-времени **. Вы не можете использовать его, чтобы получить ** часть информации ** (которая в вашем примере представляет собой размер выделенного блока памяти, возвращаемого 'malloc' и' realloc'). –

+0

Кроме того, 1) 'void main()' → 'int main (void)' 2) Удалить броски из 'malloc' и' realloc' 3) Использовать '% zu' вместо'% d', потому что 'sizeof' возвращает' size_t', а не 'int' 4) Проверьте, были ли успешны' malloc' и 'realloc', посмотрев их возвращаемые значения. –

ответ

3

sizeof(ptr) определяет размер одного целочисленного указателя. sizeof - это оператор, который статически применяется во время перевода (за исключением массивов переменной длины, но здесь это не так). Статический тип ptr - int*, поэтому вы получите sizeof(int*).

sizeof(ptr) никогда не будет sizeof(int[10]), потому что массивы не являются указателями, несмотря на то, что многие учебники ошибочно учатся.

Хорошая новость, однако, является то, что если malloc/realloc возврата любого адреса, кроме NULL, вы действительно имеете ptr точку в память, которые могут содержать 10/20 целые числа. Поэтому вам просто нужно отслеживать выделенные размеры.

Обратите внимание, что malloc и его родственники выделяют выделение памяти во время выполнения вашей программы, в противоположность sizeof, который (по большей части, VLA снова) возвращает результат до того, как ваша программа будет запущена.

+0

Я бы использовал 'компиляцию' вместо 'translation', и я бы добавил, что 'malloc' /' realloc' "делают свое дело" во время выполнения, чтобы подчеркнуть и провести различие между этими двумя случаями. Хотя техническое недопонимание OP связано с использованием 'sizeof', я думаю, что реальное понимание того, что он или она отсутствует, - это разница между временем компиляции и временем выполнения. –

+1

@barakmanos - Перевод - это термин, используемый стандартом, и я стараюсь придерживаться этого. Спасибо. – StoryTeller