当我想在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
答案 0 :(得分:6)
指针的大小为machine specific(无论是32位还是64位)。结果将分别是32位机器上的12
和8
字节。对于64位计算机,答案为16
和8
字节
参见解释
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
?
[...]特别是结构的大小就好像省略了灵活的阵列成员一样 [...]
答案 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个字节。
有一些事情你需要知道,在这种情况下没有填充,也没有
item2
。 char* data;
和char data[];
之间的差异在于最后一个是将在堆栈中分配的数组,第一个是在堆栈中分配的指针,它将与动态内存一起使用来自堆。