加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – va_arg给出了垃圾文本

发布时间:2020-12-16 09:38:32 所属栏目:百科 来源:网络整理
导读:我做了一个简单的测试用例: static void va_test(char* str_arg,...){ va_list ap; va_start(ap,str_arg); for( ; ; ) { if (str_arg == NULL) break; int n = va_arg(ap,int); printf("arg: %s,%dn",str_arg,n); str_arg = va_arg(ap,char*); } va_end(ap
我做了一个简单的测试用例:

static void va_test(char* str_arg,...)
{ 
  va_list ap;
  va_start(ap,str_arg); 
  for( ; ; ) { 
    if (str_arg == NULL)
      break; 
    int n = va_arg(ap,int);
    printf("arg: %s,%dn",str_arg,n);
    str_arg = va_arg(ap,char*);
  }
  va_end(ap);
  printf("n");
}

当我用独立的可执行文件中的va_test(“beer”,1,“cofe”,2,“juice”,3,0)运行它时,它可以正常工作.但是当我从我的项目可执行文件中调用它时,它非常大,它给出了一些像这样的垃圾字符串:

arg: bear,1
arg: cofe,2
arg: juice,3
arg: ^X(garbage...),57

我想在调用这个函数之前一定会出现内存混乱,但是如何调试呢?

[编辑]
我稍微更新了一下描述,因为严格来说,当我将超过6个args传递给va_test时会发生错误.我意识到前六个64位args是通过amd64机器中的寄存器传递的,而其他args是通过堆栈传递的.当va_arg尝试从* overflow_arg_area获取第一个arg时,会发生此问题.

解决方法

对我来说最有可能的解释是,你所处的系统中int 0具有不同于char * 0的表示.这可以在64位系统上,其中sizeof(int)== 4和sizeof(char * )== 8.

尝试将最后一个参数传递为(char *)0而不是0,你应该没问题.所有其余代码在技术上看起来都是正确的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读