использование оператора sizeof - PullRequest
9 голосов
/ 26 марта 2011

Вывод следующей программы

#include<stdio.h>
int main(){
    int *p[10];
    printf("%ld %ld\n",sizeof(*p),sizeof(p));
}

это

8   <--- sizeof(*p) gives  size of single element in the array of int *p[10] 
80  <--- sizeof(p) gives  size of whole array which is 10 * 8 in size.

теперь смотрите следующую программу

 #include<stdio.h>
 #define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
 int array[] = {23,34,12,17,204,99,16};

  int main()
  {
      int d;
      printf("sizeof(array) = %ld \n",sizeof(array));
      printf("sizeof(array[0]) = %ld \n",sizeof(array[0]));
      printf("sizeof int %ld\n",sizeof(int));
      printf("TOTAL_ELEMENTS=%ld \n",TOTAL_ELEMENTS);
      for(d=-1;d <= (TOTAL_ELEMENTS-2);d++)
          printf("%d\n",array[d+1]);

      return 0;
  }

есть

sizeof(array) = 28 
sizeof(array[0]) = 4  <--here
sizeof int 4
TOTAL_ELEMENTS=7 

Я не могу понять, почему размер (массив [0]) различен в обоих выходах.

Ответы [ 6 ]

11 голосов
/ 26 марта 2011

int *p[10]; это массив указателей.

*p является первым элементом этого массива указателей. Так что это указатель на целое число. Это не целое число.

int array[] = {23,34,12,17,204,99,16}; - массив целых чисел. Так что array[0] является первым элементом этого массива. Так что это целое число.

Размер указателя на целое число (*p) и целое число (array[0]) различаются.

То есть sizeof(*p) и sizeof(array[0]) разные.

sizeof(p) дает размер массива указателей. Так оно и есть: 10 x 8 = 80.
т.е. ( количество элементов ) x ( размер одного элемента )

sizeof(array) дает размер массива целых чисел. Так оно и есть: 7 х 4 = 28.

3 голосов
/ 26 марта 2011

В первом примере элемент является указателем на int, а во втором примере это просто int. Вы можете видеть, что указатель имеет 8 байтов, а int всего 4 байта.

1 голос
/ 26 марта 2011

array[0] имеет тип int

*p имеет тип int*

Возможно, это демонстрирует стилистическую глупость написания

int *p[10] ;

, а не

int* p[10] ;

, где второе проясняет, что int * является типом объявленного массива.

1 голос
/ 26 марта 2011

В первом примере используется размер указателя, а во втором - размер целого числа. Они могут иметь разные размеры, особенно в 64-битных системах.

1 голос
/ 26 марта 2011

В первом случае вы создали массив указателей на int, поэтому их размер равен 8, а не 4.

0 голосов
/ 26 марта 2011

В 64-битной среде для int устанавливается значение 32 бита и длины, а для указателя - 64 бита.

* p - указатель - 8 байтпоэтому 80 байт

Скорее всего, у вас есть машина AMD64 - проверьте это для деталей (включая другие варианты) http://gcc.gnu.org/onlinedocs/gcc/i386-and-x86_002d64-Options.html

...