gpt4 book ai didi

c - C 结构中 char* 和 char [] 的区别

转载 作者:太空狗 更新时间:2023-10-29 16:01:41 25 4
gpt4 key购买 nike

当我想在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

最佳答案

指针的大小是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 (p18)

[...] In particular, the size of the structure is as if the flexible array member were omitted [...]

关于c - C 结构中 char* 和 char [] 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24381554/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com