c - 如何在 C 中的同一结构中使用两个可变长度数组

标签 c data-structures struct dynamic-arrays overwrite

我有一个这样的 C 结构:

 typedef struct ip_esp_private {         /* keep track of things privately */
    u_int32_t type;        
    u_int32_t ivlen;       
    u_int32_t icvlen;      
    u_int32_t keylen;       /* length of "Encryption key */
    u_int32_t akeylen;      /*length of authn key */
  //  u_int32_t key[0];       /* key itself */
  //  u_int32_t akey[0];      /*authn key itself */

    u_int32_t *key;       /* as suggested  */
    u_int32_t *akey;      /* as suggested */

 } esp_private;

现在问题应该很明显,当我尝试写入 key 时,akey 将被覆盖。

我不确定如何保护它???

keylenakeylen 提供 keyakey 数组的长度,整个结构将在运行时填充时间。

请提供一些建议。

编辑:

  1. 是的... u_int32_t 是一个 typedef,所以不必为此烦恼

  2. 我已将零长度数组更改为上面编辑的指针。这就是我需要填写结构的方式..

    case 'k':       /* Key */
            length = stringargument(arg, &temp);
            priv->keylen = length;
    
            priv->key=malloc(priv->keylen * sizeof(u_int32_t));
            /*as suggested added this step*/          
    
    
            /*as suggested commented this step*/
            priv = (esp_private *)realloc(priv,
                            sizeof(esp_private) + length);
    
    
    
            memcpy(priv->key, temp, priv->keylen);
            pack->private = priv;
            pack->modified |= ESP_MOD_KEY;
            break;
    
    case 'K':       /* Authentication  Key */       
            length = stringargument(arg, &temp);
            priv->akeylen = length;
    
            priv->akey=malloc(priv->akeylen * sizeof(u_int32_t));
            /*as suggested added this step*/
    
    
            /*as suggested commented this step*/
            priv = (esp_private *)realloc(priv,
                            sizeof(esp_private) + length);
    
    
    
            memcpy(priv->akey, temp, priv->akeylen);
            pack->private = priv;
            pack->modified |= ESP_MOD_AKEY;
    

但没有解决..可能没有仔细重新分配,请也对这个编辑提出建议。

编辑 2:

即使在按照建议对 realloc 进行评论之后,它仍然无法正常工作。keyakey 应该在命令行,但它们采用了一些随机值。这里还有一些问题需要注意。

请帮助我,因为整个项目都因为这一小段代码中的一个微小错误而陷入困境。很快就需要它......

最佳答案

那么,在创建 esp_private< 时,你不能只将 keyakey 作为指针,并为它们分配 malloc 内存吗?/结构?

 typedef struct ip_esp_private {  
    u_int32_t type;        
    u_int32_t ivlen;       
    u_int32_t icvlen;      
    u_int32_t keylen; 
    u_int32_t akeylen; 
    u_int32_t *key;  /* change */  
    u_int32_t *akey; /* change */
 } esp_private;

void esp_private_init(esp_private *ep, /* maybe some args here for type, ivlen, etc */
                     u_int32_t *key, u_int32_t keylen, u_int32_t *akey, u_int32_t akeylen)
{
   /* maybe set up type, ivlen, etc if neccesary */

   ep->keylen = keylen;
   ep->key = malloc(keylen * sizeof(u_int32_t));
   /* copy argument key into ep->key */

   ep->akeylen = akeylen;
   ep->akey = malloc(akeylen * sizeof(u_int32_t));
   /* copy argument akey into ep->akey */
}

关于c - 如何在 C 中的同一结构中使用两个可变长度数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7870527/

相关文章:

c - strtok 不适用于非常量 char 参数

data-structures - 在 Neo4j 中创建独特的结构,它们的节点是另一个结构的一部分

c++ - struct构造函数错误,为什么使用默认构造函数会调用错误?

C - 通过调用 fclose() 转储核心

c - 使用 mmap() 如何创建动态大小的结构

c - 尝试将哈希函数转换为 C

c - 如何在 C 中的头文件中初始化结构的结构?

c - 使用 {} 进行数组初始化的未指定维度

algorithm - 构建一棵没有重复值的k叉树

c++ - 如何在链表中动态创建新节点C++