C结构中char *和char []的差异

时间:2014-06-24 08:15:39

标签: c dynamic-arrays

当我想在C结构中存储动态数据数组时,有两种方法可以编写它:

typedef struct {
   int row;
   int col;
   char* data;
} item1;

或者

typedef struct {
   int row;
   int col;
   char data[];
} item2;

他们两个都会奏效。但他们的64位Mac OSX与gcc Apple LLVM 5.1版(clang-503.0.38)有所不同:

      sizeof(item1) is 16
      sizeof(item2) is 8

为什么会有区别?而且,这两种实现还有什么不同?

完整的测试代码是:

#include <stdio.h>

typedef struct {
  int row;
  int col;
  char* data;
} item1;


typedef struct {
  int row;
  int col;
  char data[];
} item2;


int main() {
  printf("%d %d\n", sizeof(item1), sizeof(item2));
  return 0;
}

输出结果为:

16 8

2 个答案:

答案 0 :(得分:6)

指针的大小为machine specific(无论是32位还是64位)。结果将分别是32位机器上的128字节。对于64位计算机,答案为168字节 参见解释

typedef struct {
   int row;         // 4 bytes
   int col;         // 4 bytes
   char* data;      // 4/8 bytes on 32/64-bit machine
}item1 ;  

32/64位计算机上的总大小= 12/16字节。

typedef struct {
   int row;         // 4 bytes
   int col;         // 4 bytes
   char data[];     // 0 bytes --> Flexible array 
}item2 ;  

总大小= 8个字节。

为什么灵活数组的大小为0

C11:6.7.2.1(第18页)

  

[...]特别是结构的大小就好像省略了灵活的阵列成员一样 [...]

答案 1 :(得分:1)

typedef struct item2 {
   int row;
   int col;
   char data[];
}

在这个结构item2中我们有2个整数,所以在大多数系统中大小都是2*sizeof(int),而且我们还有一个未定义大小的数组char data[]因此它被视为在这种情况下,我认为如果结构中有填充,那么数组将存储的元素数量将与pading相关,但我不确定。

总计= 8个字节。

typedef struct item1 {
   int row;    
   int col;
   char* data;
}

在这个结构中,我们有2个int表示8个字节由int组成,而64个系统中的指针表示另外8个字节。

总计= 16个字节。

有一些事情你需要知道,在这种情况下没有填充,也没有 item2char* data;char data[];之间的差异在于最后一个是将在堆栈中分配的数组,第一个是在堆栈中分配的指针,它将与动态内存一起使用来自堆。