почему размер структуры отличается от размера указателя структуры - PullRequest
1 голос
/ 27 сентября 2019

Вот мой код, почему размер структуры отличается от размера указателя структуры

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

struct flx
{
    int age;
    int id;
    char name[];
}*s;


int main()
{
   char name[50]="Hi how are you";
   s=malloc(sizeof(s)+sizeof(char)*strlen(name));
   s->id=12345;
   s->age=16;
   strcpy((*s).name,name);
   printf("Id --- %d\nName --- %s\n age --- %d",s->id,s->name,s->age);
   printf("\nTotal Sizeof *s is %d \nSize of s is 
   %d",sizeof(*s),sizeof(s));
   return 0;
}

output:(In code::blocks)
Id --- 12345
Name --- Hi how are you
age --- 16
Total Sizeof *s is 8
Size of s is 4
Process returned 0 (0x0)   execution time : 0.473 s
Press any key to continue.

1) В приведенном выше коде общий размер структуры равен 8, а размер указателя равен 4, поэтому?2) Но когда я компилирую следующий код

#include<stdio.h>

int main()
{
     int *b;
     printf("sizeof b is %d\nSize of *b is %d",sizeof(b),sizeof(*b));
}

В выводе отображается

sizeof b is 4
Size of *b is 4
Process returned 0 (0x0)   execution time : 0.475 s
Press any key to continue.

, так почему sizeof struct показывает другой размер и какова причина показывать это "Размер sэто 4 "?

Ответы [ 3 ]

3 голосов
/ 27 сентября 2019

Структура, int, указатель на структуру и указатель на int - это разные типы.Нет причин, по которым они должны быть одинакового размера.

Во многих реализациях C указатель на структуру имеет тот же размер, что и указатель на int, но это не требуется стандартом C.

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

ОднакоРазмеры структур сильно различаются, так как их размеры зависят от их содержимого.Напротив, размеры указателей на структуры не зависят от содержимого структур, так же как длина почтового адреса дома зависит от размера или содержимого дома.

1 голос
/ 27 сентября 2019

Нет никакой связи между размером типа указателя и размером типа, на который он указывает.То, что sizeof (int) и sizeof (int *) дают одно и то же значение в вашей системе, является совпадением (они не в моей системе).

Указатель хранит адрес (физический или виртуальный) - в системе, такой как x86при использовании модели с плоской памятью все типы указателей имеют одинаковый размер (обычно это собственный размер слова, 32 или 64 бита в большинстве настольных систем).Однако есть некоторые странные архитектуры, в которых типы указателей могут иметь разные размеры.

Единственные требования 1 :

  • char * и void * имеют одинаковый размер и представление
  • указатели на квалифицированных илинеквалифицированные версии совместимых типов имеют одинаковый размер и представление (т. е. int * и const int * и volatile int * имеют одинаковый размер)
  • все struct типы указателей имеют одинаковый размер и представление;
  • все union типы указателей имеют одинаковый размер и представление;

Ничто не гарантируется.


C 2011 г. Онлайн-проект , п. 6.2.5, п. 28.
0 голосов
/ 27 сентября 2019

Указатель почти всегда отличается по размеру от данных, на которые он указывает, по простой и фундаментальной причине, по которой указатель отличается (отличается от точки) периодом от данных, на которые он указывает.

Указательэто не данные.Указатель - это указатель на данных.Указатель также не является копией данных.(Одним из важных применений указателей является то, что, поскольку они, как правило, намного меньше, более эффективно копировать указатели, оставляя наведенные данные на месте, а не копировать их вокруг.)

Возможно, бессмысленноаналогия: я почти 7 футов ростом и весом около 240 фунтов.И все же мое имя, когда я пишу его на листе бумаги, составляет порядка 8½ × 11 дюймов и весит меньше унции.Почему имя Стива Саммита отличается по размеру и весу от Стива Саммита?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...