Адрес как операнд в операторе sizeof () - PullRequest
0 голосов
/ 03 июля 2018

Я просто пробовал пример и пытался проверить вывод, когда в качестве аргумента в sizeof передается адрес оператор, и я получил вывод 4. Теперь мой вопрос, когда вы передаете указатель в sizeof операторе, почему он показывает 4 байта памяти, когда на самом деле нет переменной указателя, это просто только адрес?

#include<stdio.h>
int main()
{
  int a=1;
  int c;
  c=sizeof(&a);
  printf("%d\n",c);
  return 0;
}

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Это потому, что sizeof возвращает размер типа , согласно C11 6.5.3.4 The sizeof and _Alignof operators /2 (мой акцент):

Оператор sizeof возвращает размер (в байтах) своего операнда, который может быть выражением или именем типа в скобках. Размер определяется из типа операнда.

Тип &a, где a - это int, охватывается 6.5.3.2 Address and indirection operators /3 в том же стандарте:

Унарный оператор & выдает адрес своего операнда. Если операнд имеет тип «тип», результат имеет тип «указатель на тип».

Другими словами, int a; sizeof(&a) функционально эквивалентен sizeof(int *).

0 голосов
/ 03 июля 2018

sizeof оператор работает с типом операнда.

Цитата C11, глава §6.5.3.4 ( выделенная мина )

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

&a относится к типу int *, поэтому ваше утверждение совпадает с sizeof(int *). Результат - размер указателя (на целое число) в вашей платформе.

Тем не менее, sizeof в результате дает тип size_t,

  • используйте переменную типа size_t
  • используйте %zu, чтобы напечатать результат.
...