c中的大小指针与uint32指针

c中的大小指针与uint32指针,c,pointers,size-t,uint32,C,Pointers,Size T,Uint32,我在使用尺码和uint32时遇到问题* 我有一个类似的程序 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_uns

我在使用尺码和uint32时遇到问题*

我有一个类似的程序

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;
}
因为它正在调用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;
}
因此,我的问题是如何适当地获得输出长度的值。我现在读0s

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

您不能将f1返回的size\u t值直接存储到f2参数所指向的uint32\u t变量中,因为类型不同,大小也可能不同。取而代之的是,在f2中使用一个中间局部,这也给了测试超出范围条件的机会。f2返回main的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;
}
不能将f1返回的size_t值直接存储到f2参数所指向的uint32_t变量中,因为类型不同,大小也可能不同。取而代之的是,在f2中使用一个中间局部,这也给了测试超出范围条件的机会。f2返回main的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>UINT32_MAX,更有意义,我学会了+1@RohanBari实际上,这些常量被标准标记为可选的,所以严格来说,该行应该位于ifdef UINT32_MAX块内。但是,实现通常会定义这些常量。我曾想过建议在uint32_t和size_t之间进行类型转换,但如果大小不同,您的方法是安全的,但如果iflength>uint32_,您可以添加打印。谢谢。这很有效,我也明白为什么。我很感激。@IrAM这可能很吸引人,但也可能很危险。在这种情况下,实际上有两个中间步骤,当size_t和uint32_t的大小不相同时,其中一个肯定会失败,我明白了。另外,我知道那些_MAX常量,但它们在确保溢出方面的用法,如if length>UINT32_MAX,更有意义,我学会了+1@RohanBari实际上,这些常量被标准标记为可选的,所以严格来说,该行应该位于ifdef UINT32_MAX块内。但是,实现通常会定义这些常量。我曾想过建议在uint32_t和size_t之间进行类型转换,但如果大小不同,您的方法是安全的,但如果iflength>uint32_,您可以添加打印。谢谢。这很有效,我也明白为什么。我很感激。@IrAM这可能很吸引人,但也可能很危险。在这种情况下,实际上有两个中间步骤,其中一个步骤在大小\u t和uint32\u t不相同时肯定会失败,