C - sizeof (*ptr) vs sizeof (ptr)

В случае, если...

int *ptr;

ptr = malloc(sizeof(*ptr));

Какое различие есть между sizeof(*ptr) и sizeof(ptr)?

2
задан 08.03.2019, 09:04
3 ответа

sizeof(*ptr) возвратит тебя tamaГ±o контента твоего указателя костлявая tamaГ±o одного int, которого обычно 4

sizeof(ptr), возвратит тебе tamaГ±o direcciГіn в памяти из костлявого ptr tamaГ±o одного int*, которого обычно 8

Согласно твоей архитектуре, даст тебе стоимость или другой

Другой пример Такой же формы

, если бы твоего кода было

char *ptr;
ptr = malloc(sizeof(*ptr));

sizeof(*ptr), возвратит тебя tamaГ±o одного char, которого 1

sizeof(ptr), возвратит тебя tamaГ±o ее direcciГіn в memora одного char, которого обычно 8

2
ответ дан 02.12.2019, 05:51

ВїQuГ© различие есть между sizeof(*ptr) и sizeof(ptr)?

Различие очевидное:

  1. sizeof(*ptr) - tamaГ±o (size of) *ptr.
  2. sizeof(ptr) - tamaГ±o (size of) ptr.

В C, tamaГ±o данных предполагается в байт, asГ - что использовать sizeof на целом числе 32 бит (которого обычно int) возвращает стоимость, 4 (8 бит из-за байт).

В примере, что ты показал информацию ptr, - типа метких до целого числа (int *). tamaГ±o указателя измени segГєn архитектура на, который ты работал, когда могут быть 4 (32 битами) или 8 (64 битами). Особенность указателей состоит в том, что у них есть всегда тот же самый tamaГ±o независимо от типа информации, на которую они указывали бы:

int *pint;
short *pshort;

if (sizeof(pint) == sizeof(pshort))
    printf("Eureka!\n");

cГіdigo предыдущий mostrarГЎ Eureka!. Однако, у типов различных данных может быть один tamaГ±o различно:

int *pint;
short *pshort;

if (sizeof(*pint) == sizeof(*pshort))
    printf("Eureka!\n");

cГіdigo предыдущий не mostrarГЎ совсем не, так как, когда оператор des-ссылки использует, (* unario) мы попросим tamaГ±o (size of) , содержавший из указателя, не tamaГ±o указателя.

1
ответ дан 02.12.2019, 05:51

sizeof - один funciГіn, что возвращает тебя tamaГ±o в байт parГЎmetro, что ты произошел с ним.

В твоем случае, ты должен иметь в виду, что меткий сторож - один direcciГіn памяти , и tamaГ±o этой direcciГіn он меняет segГєn твою архитектуру.

В процессоре нормальных из автобуса 32 бит, tamaГ±o одной direcciГіn памяти будет являться 32 бита или 4 Байт, так как из-за Вашей одинокой шины данных может redireccionar это количество памяти, поэтому в процессоры 32 бит только возможно распределять ему ОЗУ 4GB (mГЎs или меньше), в процессоре автобуса 64 бит, direcciГіn памяти будет она у одного tamaГ±o 64 бит или 8 Байт.

char *ptr; 
size_t len = sizeof(ptr);

, если снопы это, ты печатаешь переменную len, будешь получать или 4 или 8, в зависимости от твоей архитектуры и , не импортируя , что тип информации был, потому что ahГ - он консультируется, он tamaГ±o указателя (direcciГіn памяти) не типа информации в es если.

char *ptr1;
int  *ptr2;

size_t len1 = sizeof(ptr1);
size_t len2 = sizeof(ptr2);

Поэтому razГіn, не импортируя, что переменная была типа char и другая была типа int, len1 и len2 obtendrГЎn тот же результат.

, Когда ты перемещаешь указатель со звездочкой напротив или оператором домашнего животного - ссылки, уже эти - соглашаясь на информацию, в которую esta обозначаясь, ahГ - если diferenciarГ, - в который тип информации, которыми они обладают различные tamaГ±os.

char *ptr1;
int  *ptr2;

size_t len1 = sizeof(*ptr1);
size_t len2 = sizeof(*ptr2);

В этом примере, если habrГЎ различие, потому что ptr1 обозначается, - в тип информации char, одинокая которая 1 Байт, и ptr2 укажи на тип информации int, которая 4 байт.

0
ответ дан 02.12.2019, 05:51