将sizeof与具有固定长度数组的struct一起使用
当结构具有固定长度数组时,使用sizeof(struct)是否是一种良好的编码实践将sizeof与具有固定长度数组的struct一起使用,c,arrays,struct,sizeof,C,Arrays,Struct,Sizeof,当结构具有固定长度数组时,使用sizeof(struct)是否是一种良好的编码实践 #define NUM_TRACKS 10 #define NUM_SAMPLES 250 typedef struct _DATA_PROC { uint16_t count[NUM_TRACKS] ; int16_t data[NUM_TRACKS][NUM_SAMPLES]; } tDataProcessing ; tDataProcessing* tDp = malloc(sizeo
#define NUM_TRACKS 10
#define NUM_SAMPLES 250
typedef struct _DATA_PROC
{
uint16_t count[NUM_TRACKS] ;
int16_t data[NUM_TRACKS][NUM_SAMPLES];
} tDataProcessing ;
tDataProcessing* tDp = malloc(sizeof(tDataProcessing)) ;
我个人更喜欢使用指针变量本身,而不是类型:
tDataProcessing *tDp = malloc(sizeof *tDp);
这在类型中隐藏指针的情况下有时更为明显。对于表达式中的初学者,除了极少数例外(包括
sizeof
运算符),数组被隐式转换为指向其元素类型的指针
例如数组
int16_t data[NUM_TRACKS][NUM_SAMPLES];
在表达式中转换为
int16_t ( *data )[NUM_SAMPLES];
不像你在评论中写的那样
int16_t** data
然而,声明不是一个表达式。因此,sizeof
运算符返回容纳结构中所有数据成员的字节数,而不进行任何隐式转换
来自C标准(6.5.3.4操作员的尺寸和校准)
2 sizeof运算符生成其操作数的大小(以字节为单位),其中
可以是表达式或类型的括号名称。尺寸是
根据操作数的类型确定。结果是一个整数。如果
操作数的类型是可变长度数组类型,即操作数
这是一个演示程序
#include <stdio.h>
int main(void)
{
enum { N = 10 };
int a[N];
printf( "sizeof( a ) = %zu\n", sizeof( a ) );
struct A
{
int a[N];
};
printf( "sizeof( struct A ) = %zu\n", sizeof( struct A ) );
return 0;
}
阅读本文的其他人会遇到一些相关问题:为什么不会呢?我想确保一些编译器不会将其解释为:typedef struct_DATA_PROC{uint16_t*count;int16_t**DATA;}tDataProcessing;请在问题中输入代码,它在注释中不可读。不,它不会那样做
sizeof
将为您提供存储对象所需的大小。数组位于对象本身内部,而不是它所指向的。任何编译器都不允许将问题中的结构误解为typedef struct\u DATA\u PROC{uint16\u t*count;int16\u t**DATA;}tDataProcessing代码>-至少,如果它是标准C编译器,它不能声称是标准C编译器。我不确定这是否安全,因为您取消了对未初始化的tDp
的引用,即使您没有对它做任何操作。我相信sizeof
的参数仍然会产生副作用。@ThomasJager:没关系-sizeof
不会取消指针的引用。我不确定这是否是问题的答案,但它所暗示的是犹太教的。是的,sizeof不评估它的表达。@JonathanLeffler啊,好吧,我把它可能有副作用和它总是有副作用混淆了。如果tDp
的类型发生变化,这会更安全。
sizeof( a ) = 40
sizeof( struct A ) = 40