使用C中相同结构中另一个值的值设置结构内部数组的大小

时间:2014-09-10 10:42:36

标签: c arrays struct

    struct {
        uint16 msg_length;
        uint8 msg_type;
        ProtocolVersion version;
        uint16 cipher_spec_length;
        uint16 session_id_length;
        uint16 challenge_length;
        V2CipherSpec cipher_specs[V2ClientHello.cipher_spec_length];
        opaque session_id[V2ClientHello.session_id_length];
        opaque challenge[V2ClientHello.challenge_length;
    } V2ClientHello;

是否可以执行与上述类似的操作(http://tools.ietf.org/html/rfc5246)?如果是这样,我如何在C内编码?

在结构中更具体这一行:

  

V2CipherSpec cipher_specs [V2ClientHello.cipher_spec_length];


用途:

  

V2ClientHello.cipher_spec_length


这是在同一个结构中定义的,用于设置数组的长度。

4 个答案:

答案 0 :(得分:4)

C不支持动态大小的数组。为了实现目标,可以使用类型为V2CipherSpec的指针作为结构变量,并使用V2ClientHello.cipher_spec_length值在稍后阶段分配内存。

答案 1 :(得分:3)

绝对不是。 C没有动态大小的数组。相反,我们可以依靠这样的技巧:

struct {
    uint16 msg_length;
    uint8 msg_type;
    ProtocolVersion version;
    uint16 cipher_spec_length;
    uint16 session_id_length;
    uint16 challenge_length;
    char extra[0]; // or 1 if your compiler hates this
} V2ClientHello;

然后,不要直接创建此结构的实例,而是通过malloc():

struct V2ClientHello* hello = malloc(sizeof(V2ClientHello) + 
    len1*sizeof(V2CipherSpec) + len2 + len3);

现在您拥有了所需大小的动态分配结构。您可以使用访问器函数来获取“额外”字段:

V2CipherSpec* get_spec(V2ClientHello* hello, int idx) {
    assert(idx < hello->cipher_spec_length);
    return ((V2CipherSpec*)&hello->extra)[idx];
}

当然,你可以在一个创建例程中包含malloc()调用,该例程获取所有三个动态部分的大小,并在一个地方完成所有操作以确保健壮性。

答案 2 :(得分:0)

RFC中显示的代码是伪代码,您无法如图所示实现它。

一旦知道了值,您需要根据V2ClientHello.cipher_spec_length和其他长度规范字段手动分配这些数组。

答案 3 :(得分:0)

&#34; V2ClientHello.cipher_spec_length&#34;的值在编译时不可用。您不能在运行时指定数组的大小,而是使用:

V2CipherSpec * cipher_specs;

在struct中并使用malloc或calloc在运行时分配一块内存。

V2ClientHello.cipher_specs =(V2CipherSpec *)malloc(V2ClientHello.cipher_spec_length);