无法理解C中的转换

 2020-11-22 

Unable to understand casting in C

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

1
2
3
4
5
6
7
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:通过

1
2
3
4
5
6
7
8
9
  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:失败

1
2
3
4
5
6
7
8
  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及其指针表亲之间的转换。


可能发生的情况是sgx_unseal_data函数在此处模拟了按引用传递。

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

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

这个问题与转换完全无关,只是您无法获得右值的地址。