объясняя различные значения для указателей и sizeof структуры - PullRequest
0 голосов
/ 31 октября 2018

Я новичок здесь и я новичок в программировании. Я изучаю структуры, указатели и функции и как они все работают вместе в C. Я пытаюсь понять результаты, которые я получаю для следующего кода:

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

typedef struct {
  int* data;
  unsigned int len;
} intarr_t;

intarr_t* intarr_create( unsigned int len )
{
  intarr_t* parr= malloc(sizeof(intarr_t));
  parr->data= malloc(len*sizeof(int));
  parr->len= len;

  if (parr->data && parr)
    return parr;
  else
    return NULL;
}

int main()
{ 
  intarr_t* p = intarr_create(3); //creat a typedef struct "intarr_t" with data pointer that has 3 integer values allocate to it.
  printf("%ld %ld %ld %ld %ld %ld %ld\n",sizeof(p), sizeof(*p), sizeof(*(p->data)), sizeof(p->data), sizeof(*(&(p->data))), sizeof(&(p->data)), sizeof(p->data[0]));
  printf("%p %p %p %p %p\n", (void*)p, (void*)p->data, (void*)&(p->len), (void*)&(p->data), (void*)&(p->data[0]));
  intarr_destroy(p);
}

Я получаю тот же вывод для того, что я всегда устанавливал для "len".

8 16 4 8 8 8 4
0x55f672e0c260 0x55f672e0c280 0x55f672e0c268 0x55f672e0c260 0x55f672e0c280

Может кто-нибудь объяснить, пожалуйста, каждый из результатов и соответствующую часть из кода? какой из них ссылается на указатель, указатель на данные и значения в данных, разыменование каждого из них? почему размеры являются тем, чем они являются? Почему размер данных адреса изменяется в каждой опции и почему не меняются, когда я изменяю размер элементов (len)? Этот код, который я построил, заставил меня больше запутаться в целом, что есть что и как отличать понятия от других. Извините за грязный длинный вопрос. Опять же, это мое первое, так что будьте милы с вашей критикой и будьте внимательны с вашим ответом. Спасибо.

1 Ответ

0 голосов
/ 31 октября 2018
8 - sizeof(p) - size of a pointer to struct inarr_t which is the same as size of any pointer 
16 - sizeof(*p) - size of struct inarr_t consisting of an int and a pointer with padding 
4 - sizeof(*(p->data)) - size of int
8 - sizeof(p->data) - size of pointer to int which is the same as size of any pointer 

8 - sizeof(*(&(p->data))) - size of pointer to int (*& is dereferencing a pointer to pointer) 
8 - sizeof(&(p->data)) - size of pointer to pointer to int
4 - sizeof(p->data[0])) - size of int (the first element of int array)

Независимо от того, какой размер len, вышеуказанные значения не изменятся.

Примечание. Стандарт C не требует, чтобы указатели разных типов имели одинаковый размер - хотя он является общим. И это похоже на вашу систему.

...