首页 > 其他分享 >stdarg.h头文件中va_arg的使用(关于类型获取)

stdarg.h头文件中va_arg的使用(关于类型获取)

时间:2024-01-18 19:22:07浏览次数:24  
标签:va 头文件 int 获取 arg 2147483648 指针

简介:此博客用于简单分析va_arg函数完成特定类型获取后指针移动的问题(针对int型参数i= -2,147,483,648获取后,指针偏移发生的错误)。

 

 我在使用stdarg.h头文件模拟实现printf函数时遇见这样的情况:

 使用va_arg对函数可变参数进行特定类型获取后,va_arg函数再次读取时发生了关于地址访问的相关错误,如下述代码。

int printf(const char *fmt, ...) {
  const char *fm=fmt;
 int n=0;

  va_list ap;
  va_start(ap,fmt);

  //-2147483648
  char buf[10];
  for(int i=0;i<10;i++){
    buf[i]='\0';
  }

  while(*fm!='\0')
  {
    if(*fm=='%')
    {
      fm++;
      switch(*fm)
      {
        case 'd':{ 


        int i = va_arg(ap,int);
        int index=0;
        if (i<0)
        {
          putch('-');
        }
        for(int j=0;j<10;j++)
        {
          buf[j]=i%10>0 ? i%10 : 0-(i%10);
          i=i/10;
          if(i==0){index=j;break;}
        }
        for(int j=index;j>=0;j--)
        {     
          putch(buf[j]+48);
          if(buf[j]=='\0'){break;}
        }
        for(int i=0;i<10;i++){
          buf[i]='\0';
        }
        fm++;n++;
        break;}

        case 's':{
        char const *to_cpy = va_arg(ap,char*);
        putstr(to_cpy);
        fm++;n++;      
        break;}
      }
    } 
    else
        {putch(*fm); fm++;}

  }
  va_end(ap);
  return n;
}

 

错误分析:上述代码中,va_arg函数获取了int型整数(4字节)之后,指针向后进行偏移。但是由于-2147483648数值仍然是以八个字节存储,这是指针偏移了四个字节,因此没有到达下一个参数的地址,导致va_arg中指针使用的混乱。 简单修改:对-2147483648进行判断,在获取此数值之后va_arg再次进行一次int类型的获取(目的是让指针偏移,但不取值)。————>if(i==-2147483648){va_arg(ap,int);}

 

标签:va,头文件,int,获取,arg,2147483648,指针
From: https://www.cnblogs.com/smith-count/p/17972160

相关文章

  • SpringMVC中@pathVariable 为spring的注解,都可以用在Controller 层接受前段传递的数据
    @PathVariable主要接收http://host:port/path{参数值}数据 @pathVariable作为借口是,url是http"//ww.yoodb.com/user/getUserById/2 @RequestParam主要用于接受http://host:port/path?参数名=值数据值 @ResquesrParam请求接口时,url是http://www.yoodb.com/user/getUsrBy......
  • stable Diffusion java接口
    StableDiffusionJava接口介绍引言在现代计算机科学中,信息传播或数据扩散是一个重要的概念。它可以用来模拟和分析各种现象,如社交网络中的信息传播、病毒传播以及多个实体之间的通信等。稳定扩散是一种特殊类型的信息传播,它指的是在一段时间内,信息传播的速度和传播范围达到了一......
  • java AI写作
    使用Java实现AI写作作为一名经验丰富的开发者,我将教会你如何使用Java实现AI写作。在本文中,我将向你展示实现这一目标的步骤,并提供每个步骤所需的代码示例和注释。整体流程下面是使用Java实现AI写作的整体流程。你可以使用下面的表格来记录每个步骤的详细信息。步骤描述......
  • Vantage客服我们很安全,牌照自己公司授权使用?
    今日是iFXEXPO,迪拜世博展的最后一天~不过今天真相哥要带大伙看的是,昨天参展的券商Vantage~从这次展会的赞助商展牌来看,Vantage在此次展会中的规模应该是中等偏下的,Vantage和STARTRADERPRIME以及UltimaMarkets独占一栏,而Exness可谓是这次展会的老大,,独占“C”位~话题扯远了,让我们......
  • JavaScript数组使用方法
    constarr=[4,3,2,1];/*操作数组*///在末尾添加元素arr.push(5);//结果:[4,3,2,1,5]//在开头添加元素arr.unshift(0);//结果:[0,4,3,2,1,5]//移除最后一个元素arr.pop();//结果:[0,4,3,2,1]//移除第一个元素arr.shift();//结果:[4,3,2......
  • 毕设2:JavaFX预览PDF
    找了一些资料,汇总一下。1.封装好的PDF预览器PDFViewerFXGitHub上的一个预览器,封装了pdf.js,也就是通过塞一个浏览器进app来解析pdf。试了一下功能不知道为什么疯狂error,动一动给就卡死了。OpenViewerFX 神秘预览器,除了maven全网查无此人。顺着官网,也就是Jpedal的公司找过去......
  • java 基础常见(上)
    titlecategorytagheadJava基础常见面试题总结(上)JavaJava基础metanamecontentkeywordsJVM,JDK,JRE,字节码详解,Java基本数据类型,装箱和拆箱metanamecontentdescription全网质量最高的Java基础常见知识点和面试题......
  • Copilot测试java
    Copilot测试java实现流程1.简介Copilot是GitHub最近推出的一款基于机器学习的代码编写助手,它可以根据上下文和注释自动生成代码。本文将介绍如何在Java开发中使用Copilot进行代码测试。2.准备工作在开始使用Copilot测试Java之前,你需要先完成以下准备工作:安装并配置好Java开......
  • java调用文心一言实现聊天机器人
    Java调用文心一言实现聊天机器人随着人工智能的发展,聊天机器人在我们的生活中扮演着越来越重要的角色。聊天机器人能够与人类进行对话,提供信息和解决问题,为我们带来了很多便利。在本文中,我们将介绍如何使用Java编程语言调用文心一言API来实现一个简单的聊天机器人。首先,我们需要......
  • 运行新建Flutter项目, 报错Exception in thread “main“ java.net.ConnectException:
    新建项目后,直接使用demo进行安卓真机运行时报错Exceptioninthread"main"java.net.ConnectException:Connectiontimedout:connect atjava.base/sun.nio.ch.Net.connect0(NativeMethod) atjava.base/sun.nio.ch.Net.connect(Net.java:579) atjava.base/sun.nio.ch.N......