【问题标题】:size_t pointer vs uint32_t pointer in cc中的size_t指针与uint32_t指针
【发布时间】:2021-05-06 07:37:14
【问题描述】:

我在使用 size_t*uint32_t* 时遇到问题

我有一个类似的程序

int main ()
{
  size_t out_length;
  .
  .
  .
  func_1(param_1, ..., &out_length); 
  out_length > some_numberl;
}

func_1(param_1, ... , size_t *length)
{
 .
 .
 .
   *length = 0; 
 .
 .
   *length = to_some_unsigned_number;
}

因为它在main 中调用func_1(); 工作正常,但现在我必须在另一个看起来像这样的函数中调用func_1();

   func_2(param_1, ...,uint32_t* output_length)
   {
     
   }

所以程序现在看起来像这样

int main ()
{
      size_t out_length;
      .
      .
      .
      func_2(param_1, ..., &out_length); 
      out_length > some_number;
}

func_2(param_1, ...,uint32_t* output_length)
{
    func_1(param_1, ... ,output_length);
    
     //stuff
}

func_1(param_1, ... , size_t *length)
{
     .
     .
     .
       *length = 0; 
     .
     .
       *length = to_some_unsigned_number;
}

所以我的问题是如何正确获取output_length 的值。我目前读的是 0。

如果有人能指出正确的方向,我将不胜感激。

【问题讨论】:

    标签: c pointers size-t uint32


    【解决方案1】:

    您不能将f1 返回的size_t 值直接存储到f2 参数指向的uint32_t 变量中,因为类型不同,大小也可以不同。相反,在f2 中使用中间本地,这也提供了测试超出范围条件的机会。 f2main 返回的 uint32_t 值也是如此,只是方向相反。

    #include <stdlib.h>
    #include <stdint.h>
    
    void func_1(size_t* length)
    {
        *length = 42;
    }
    
    void func_2(uint32_t* output_length)
    {
        size_t length;
        func_1(&length);
        if(length > UINT32_MAX) exit(1); // out of range
        *output_length = (uint32_t)length;
    }
    
    int main()
    {
        size_t out_length;
        uint32_t f2_length;
        func_2(&f2_length);
        out_length = f2_length;
    }
    

    【讨论】:

    • 我明白了。另外,我知道那些_MAX 常量,但它们在确保溢出方面的用法,如if (length &gt; UINT32_MAX),更有意义,我学会了! +1
    • @RohanBari 实际上,这些常量被标准标记为 optional,所以严格来说,该行应该在 #ifdef UINT32_MAX 块内。但是,实现通常会定义这些常量。
    • 我想建议在uint32_tsize_t 之间进行类型转换,但是在大小不同的情况下你的方法是安全的,你可以在if(length &gt; UINT32_MAX) 的情况下添加打印
    • 谢谢。那行得通,我也明白为什么。我很感激。
    • @IrAM 施法可能很诱人,但也可能很危险。在这种情况下,实际上有两个中间步骤,当size_tuint32_t 的大小不同时,一个肯定会失败,
    猜你喜欢
    • 2014-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 2021-10-02
    • 2019-02-22
    • 2021-08-14
    • 2016-10-30
    相关资源
    最近更新 更多