将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

当结构具有固定长度数组时,使用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(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