【问题标题】:Get the wrong answer——about uncertain number of variables得到错误答案——关于不确定的变量数
【发布时间】:2021-12-26 07:04:01
【问题描述】:

当我在 Linux 系统中运行下面的程序时,我无法得到预期的答案“9”。但是我可以在windows系统中得到它。

为什么会这样?

#include <stdio.h>

int sum(int num, ...){
    int* p = &num + 1;
    int res = 0;
    while(num--){
        res += *p++;
    }
    return res;
}


int main(){
    printf("%d\n", sum(3,2,3,4));
    return 0;

}

我在GDB中调试,如下图: enter image description here

我的系统配置如下。

Linux 版本 5.11.0-41-generic (buildd@lgw01-amd64-005) (gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0, GNU ld (GNU Binutils for Ubuntu) 2.34)

【问题讨论】:

  • 关于:res += *p++; 这会有优先级问题。建议:res += (*p)++;
  • 关于:int* p = &amp;num + 1; 取决于我们是向上还是向下构建堆栈,这不会访问任何参数

标签: c variadic-functions function-definition


【解决方案1】:

您需要使用在标头&lt;stdarg.h&gt; 中定义的宏。

你来了。

#include <stdio.h>
#include <stdarg.h>

long long int sum( size_t n, ... ) 
{
    long long int result = 0;

    va_list ap;

    va_start( ap, n );

    while (n--)
    {
        result += va_arg( ap, int );
    }

    va_end( ap );

    return result;
}

int main( void )
{
    printf( "%lld\n", sum( 9, 1, 2, 3, 4, 5, 6, 7, 8, 9 ) );
}

程序输出是

45

【讨论】:

  • 我明白了!感谢您的帮助。
  • @Qiangz 完全没有。不客气。:)
  • 我仍然想知道为什么我的程序在Windows系统的CLion上运行可以得到预期的结果,而在Linux的GCC中却没有。
  • @Breeze 看来你的对齐方式不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-06
  • 2015-12-15
  • 1970-01-01
  • 2022-07-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多