无法理解C中的铸造

时间:2018-02-15 04:38:46

标签: c casting

我有一个库函数,其签名如下:

sgx_status_t sgx_unseal_data(
const sgx_sealed_data_t * p_sealed_data,
uint8_t * p_additional_MACtext,
uint32_t * p_additional_MACtext_length,
uint8_t * p_decrypted_text,
uint32_t * p_decrypted_text_length
);

现在,对于uint32_t * p_decrypted_text_length。

案例1:通过

  char resecret[50];
  uint32_t resecret_len = sizeof(resecret);

  status = sgx_unseal_data(
          (sgx_sealed_data_t*)sealed_data,
          NULL,
          NULL,
          (uint8_t*)&resecret,
          (uint32_t*)&resecret_len); //Notice last parameter

案例2:失败

  char resecret[50];
//  uint32_t resecret_len = sizeof(resecret);
  status = sgx_unseal_data(
          (sgx_sealed_data_t*)sealed_data,
          NULL,
          NULL,
          (uint8_t*)&resecret,
          (uint32_t*)&(sizeof(resecret))); //Notice last parameter

我的问题是第二种情况失败的原因。我在铸造中缺少什么?另外,如果你能解释一下uint_8t,uint_32t,size_t和它们的指针堂兄弟之间的投射。

1 个答案:

答案 0 :(得分:3)

可能发生的是sgx_unseal_data函数模拟通过引用传递

您将指针传递给变量,因此该函数可以取消引用指针以进行赋值。

sizeof返回的值是编译时值,即所谓的rvalue。首先,你无法获得这些值的地址,就像试图获取整数文字的地址一样(例如&12这是无意义的)。其次,即使获得rvalue的地址是有效的,对该位置的赋值也没有价值,因为你没有变量存储它。

这个问题根本与你的投射无关,只是你无法获得右值的地址。