【问题标题】:Using sizeof with struct with fixed length array将 sizeof 与具有固定长度数组的结构一起使用
【发布时间】:2019-08-26 17:29:07
【问题描述】:

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

【问题讨论】:

  • 其他阅读本文的一些相关问题:stackoverflow.com/questions/57662381/…
  • 为什么不呢?
  • 我想确保某些编译器不会将其解释为: typedef struct _DATA_PROC { uint16_t* count ; int16_t** 数据; } tDataProcessing ;
  • 请在问题中输入代码,在评论中不可读。不,它不会那样做。 sizeof 将为您提供存储对象所需的大小。数组在对象本身之内,而不是它所指向的。
  • 不允许编译器将问题中的结构曲解为 typedef struct _DATA_PROC { uint16_t* count; int16_t** data; } tDataProcessing; — 至少,如果确实如此,它不能声称是符合标准的 C 编译器。

标签: c arrays struct sizeof


【解决方案1】:

我个人更喜欢使用指针变量本身而不是类型:

tDataProcessing *tDp = malloc(sizeof *tDp);

这有时在指针隐藏在类型等的情况下会更清楚。

【讨论】:

  • 我不确定这实际上是否安全,因为您取消引用未初始化的tDp,即使您不使用它做任何事情。我相信sizeof 的争论仍然会产生副作用。
  • @ThomasJager:很好——sizeof 不会取消引用指针。我不确定这是对这个问题的回答,但它暗示的是犹太洁食。
  • 是的,sizeof 不计算其表达式。
  • @JonathanLeffler 啊,好吧,我很困惑它能够产生副作用,而它总是有副作用。
  • 这在tDp的类型改变的情况下更安全。
【解决方案2】:

对于表达式中的初学者,除了 sizeof 运算符在内的极少数例外,数组被隐式转换为指向其元素类型的指针。

例如数组

int16_t data[NUM_TRACKS][NUM_SAMPLES];

转换为像

这样的表达式
int16_t ( *data )[NUM_SAMPLES];

不像你在评论中写的那样

int16_t** data

但是,声明不是表达式。因此sizeof 运算符返回字节数以容纳结构的所有数据成员,而无需任何隐式转换。

来自 C 标准(6.5.3.4 sizeof 和 alignof 运算符)

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;
}

它的输出是

sizeof( a ) = 40
sizeof( struct A ) = 40

【讨论】:

    猜你喜欢
    • 2020-01-15
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    • 2011-01-17
    • 2017-01-03
    相关资源
    最近更新 更多