【问题标题】:Storing allocated value to allocated array将分配的值存储到分配的数组
【发布时间】:2020-02-09 16:52:46
【问题描述】:

我的代码是这样的:

uint8_t* payload = (uint8_t*)malloc(payload_size);
uint8_t* payloads = (uint8_t*)malloc(payload_size * 100);

for(uint8_t i = 0; i < 100; i++ ){

create_payload(payload); //cannot modify 

//myapproach
payloads[i] = payload;

}

这甚至没有编译。

我想将有效负载值存储到有效负载数组中,因为有效负载变量在每次迭代时都会被替换。

有没有简单的解决办法?

【问题讨论】:

  • payloads 似乎是一个指针数组,所以你不需要uint8_t** payloads = (uint8_t**)malloc(payload_size * 100); 吗?如果是这样,还有一个问题,payload 只分配了一次,为什么?
  • create_payload 返回/接受什么?它的签名是什么样的?
  • payloads[i] = *payload; 您需要取消引用它,因为有效负载是一个指针,但您可能想要存储值,而不是指针。
  • 你有一个指针payload。您要存储该指针还是要存储它指向的值?如果要存储值,需要先解引用指针。
  • @Mattia 显示一个演示问题的最小完整程序。

标签: c memory-management malloc dynamic-memory-allocation


【解决方案1】:

创建一个uint8_t指针类型的数组:

uint8_t* payloads[100];

然后将该数组的一个元素设置为您拥有的有效负载指针:

payloads[i] = payload;
// make sure payload is of type uint8_t pointer

【讨论】:

    【解决方案2】:

    首先,payloads 应该指向 uint8_t 的指针,而不是 uint8_t 本身(因为你想在这个数据上存储指针)

    然后,您为每个有效负载创建使用相同的缓冲区,因此您使用指向相同数据的指针填充有效负载,您需要为每个有效负载分配新的缓冲区

    最后 - 结果缓冲区的大小将是

    size of one entry *pointer* * count of entries
    

    不是

    size of one entry * count of entries
    

    因此生成的代码将是:

    
    uint8_t** payloads = (uint8_t**)malloc(sizeof(uint8_t*) * 100);
    // uint8_t* payloads[100]; - Will also work
    
    for(uint8_t i = 0; i < 100; i++ ){
        uint8_t* payload = (uint8_t*)malloc(payload_size);
    
        create_payload(payload); //cannot modify 
    
        payloads[i] = payload;
    }
    

    或者,如果您想让所有有效负载都在同一个缓冲区中,请使用malloc 将有效负载复制到输出:

    uint8_t* payload = (uint8_t*)malloc(payload_size);
    uint8_t* payloads = (uint8_t*)malloc(payload_size * 100);
    
    for(uint8_t i = 0; i < 100; i++ ){
    
        create_payload(payload); //cannot modify 
    
        memcpy(payloads + i * payload_size, payload, payload_size);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-14
      • 2017-04-10
      • 2020-09-01
      • 2013-12-18
      • 2015-03-11
      • 2015-01-11
      • 1970-01-01
      相关资源
      最近更新 更多