Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c数组包装结构不允许malloc_C_Struct_Stack_Wrapper - Fatal编程技术网

c数组包装结构不允许malloc

c数组包装结构不允许malloc,c,struct,stack,wrapper,C,Struct,Stack,Wrapper,(顺便说一句,我不允许在这里使用malloc,我是用c为c99编写的) 我试图在c中为数组创建一个包装器结构,以保持整洁,因此我不需要一直传递数组指针和长度,只需使用一个结构: #define MAX_LEN 64 typedef struct { uint8_t data[MAX_LEN]; size_t len; } byteArray_t; 如果已知MAX_LEN,这很好,但是有没有一种方法可以使length变量在编译时是已知的,例如我可以得到如下结果: typed

(顺便说一句,我不允许在这里使用malloc,我是用c为c99编写的) 我试图在c中为数组创建一个包装器结构,以保持整洁,因此我不需要一直传递数组指针和长度,只需使用一个结构:

#define MAX_LEN 64

typedef struct {
    uint8_t data[MAX_LEN];
    size_t   len;
} byteArray_t;
如果已知MAX_LEN,这很好,但是有没有一种方法可以使length变量在编译时是已知的,例如我可以得到如下结果:

typedef struct {
    byteArray_t tag;
    byteArray_t length;
    byteArray_t value;
} tlv_t;
其中,与
标记
对应的数组对于其他数组将具有大小
MAX_tag_LEN
,依此类推-因此我需要以某种方式告诉编译器情况就是这样

有人有什么想法吗?谢谢

编辑

好的,很抱歉给你添麻烦。这就是我要做的。 我目前基本上有以下结构:

// tag object
typedef struct {
    uint8_t  data[MAX_TAG_LENGTH_IN_BYTES];
    uint32_t len;
} tlvTag_t;

// length object
typedef struct {
    uint8_t  data[MAX_LENGTH_OF_LENGTH_IN_BYTES];
    uint32_t len;
} tlvLength_t;

typedef struct tlv tlv_t;

// value object definition
typedef struct {
    // can consist of a byte array, or a list of sub TLVs
    union {
        uint8_t data[MAX_VALUE_LENGTH_IN_BYTES];
        // data can be parsed into subTLVs
        tlv_t* subTLVs;
    };

    // need to store the number of subTLVs
    uint32_t numberOfSubTLVs;

    // len is the total length of the data represented:
    // the total length of the subTLVs placed end to end
    // or the length of the data array.
    uint32_t len;

} tlvValue_t;

// tlv object definition
struct tlv {
    tlvTag_t    tag;
    tlvLength_t len;
    tlvValue_t  value;

    // total length of entire tlv block (not value length)
    // (if there are sub TLVs, place them end to end)
    uint32_t totalLen;
};

我认为如果我可以将数组包装在另一个结构中,以避免所有代码重复,并能够传递更少的参数,那么设计会更好,但我不能,因为我不知道如何告诉编译器创建不同大小的字节数组-也许可以使用宏?希望这是有意义的。

如果创建这样的结构,然后将其按值传递给函数,那么整个数组将按值传递。你不想那样

实际上,在结构中不需要数组,只需在其他地方声明它即可

typedef struct {
    uint8_t* data;
    size_t   len;
} byteArray_t;


int main()
{
  uint8_t some_array[X];
  ...
  byteArray_t wrapper = {some_array, X};
  some_function (&wrapper);
}

您似乎试图以某种方式声明一个结构,其内容依赖于一个参数。在C++中,可以通过模板实现:

template <size_t MAX_LEN>
struct byteArray_t
{
    uint8_t data[MAX_LEN];
    size_t   len;
};

...
byteArray_t<MAX_TAG_LENGTH_IN_BYTES> tag;
byteArray_t<MAX_LENGTH_OF_LENGTH_IN_BYTES> len;
...
或者(相同),但不声明类型(如果结构不需要名称,则很好):


这可能比您已有的代码稍微好一些。然而,在我看来,这是不值得的,因为任何非平凡的宏都会降低代码的可读性。

编译器接受定义宏的开关。检查编译器的文档,它允许这样做(例如MSVC的
/D
)。这比只传递普通指针和普通大小变量更整洁吗?您想要实现什么?请记住,此代码在现实世界中可能没有什么好处,超出了此问题的范围。问题是试图找到一个解决方案,没有问题要解决。谢谢你的回答。我不确定你是否明白我想做什么,也许我没有说清楚。。。我可以做一个byteArray\u t*p字节,然后把它传过来,对吗?在我看来,少了一个参数会使api更简单。。。然而,主要的一点是能够定义tlv_t对象somehow@Matthew这正是这段代码的作用。得到一个函数参数,而不是两个。总的来说,我相信程序的可读性会因此大大降低。我感谢你的帮助,但你似乎没有得到我想要做的。请重新阅读问题-我可以定义byteArray\u t结构,没问题。然而,主要的一点是能够以某种方式定义tlv_t对象。我很抱歉,如果这不清楚,在我看来应该有一个优雅的解决方案,但需要一些开箱思考。我习惯于在爪哇和C++写作,所以也许C的精神是不同的。“马修,我也读了你的问题,也没有得到你想要做的。这似乎是一个有趣的问题;请添加更多信息,以便每个人都能从中受益。(可能添加C++或java等价于你在C中尝试做的事情?)
#define DECLARE_BYTE_ARRAY_T(your_type_name, MAX_LEN) \
typedef struct { \
    uint8_t data[MAX_LEN]; \
    size_t   len; \
} your_type_name

DECLARE_BYTE_ARRAY_T(tlvTag_t, MAX_TAG_LENGTH_IN_BYTES);
DECLARE_BYTE_ARRAY_T(tlvLenght_t, MAX_LENGTH_OF_LENGTH_IN_BYTES);

...
tlvTag_t tag;
tlvLength_t len;
#define BYTE_ARRAY_T(MAX_LEN) \
struct { \
    uint8_t data[MAX_LEN]; \
    size_t   len; \
}

BYTE_ARRAY_T(MAX_TAG_LENGTH_IN_BYTES) tag;
BYTE_ARRAY_T(MAX_LENGTH_OF_LENGTH_IN_BYTES) len;