说明指针和sizeof结构的不同值

时间:2018-10-31 04:53:44

标签: c function pointers struct typedef

我在这里是新手,也是编程新手。我正在学习结构,指针和函数,以及它们如何在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 :(得分:2)

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标准不需要通用的不同类型的指针具有相同的大小。在您的系统上似乎就是这种情况。