C 字符是否作为整数传递给被调用函数?

C 字符是否作为整数传递给被调用函数?,c,gcc,integer,character,variadic-functions,C,Gcc,Integer,Character,Variadic Functions,我在下面编写了一个C程序来调用参数数目可变的函数 #include<stdio.h> #include<stdarg.h> void display(int, int, ...); int main() { display(1,5,1,2,3,4,5); display(2,3,'A','B','C'); printf("\n"); return 0; } void display(int type, int tot_num, ...

我在下面编写了一个C程序来调用参数数目可变的函数

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

void display(int, int, ...);

int main()
{
    display(1,5,1,2,3,4,5);
    display(2,3,'A','B','C');
    printf("\n");
    return 0;
}

void display(int type, int tot_num, ...)
{
    int i, j;
    char c;

    va_list ptr;
    va_start (ptr, tot_num);

    switch(type)
    {
            case 1:
            for (j=0; j<tot_num; j++)
            {
                    i = va_arg (ptr, int);
                    printf("%d ",i);

            }
            break;

            case 2:
            for (j=0; j<tot_num; j++)
            {
                    c = va_arg(ptr, char);
                    printf("%c ",c);
            }
    }
}
第41行是
c=va_arg(ptr,char)

当我阅读va_arg的man 3页面时,它被提到如下:

如果没有下一个参数,或者如果类型与实际下一个参数的类型不兼容(根据默认参数升级进行升级),则会发生随机错误

当我读到这篇文章时,我想
c=va_arg(ptr,char)是正确的,因为变量参数列表中的数据是个字符。然而,gcc发出的上述警告表明,传递的变量参数实际上不是字符,而是整数

根据gcc的建议,我将其更改为
c=va_arg(ptr,int),现在我没有收到任何警告。当我运行程序时,我也得到了预期的输出

那么,字符(第二次调用
main()
中的
diplay()
)是否作为整数传递给
display()


谢谢

'A'
的类型是
int
,请尝试以下操作

printf("typeof('A') == typeof(int) -> %s\n", 
         (sizeof('A') == sizeof(int)) ? "YES" : "NO");
自己检查一下

编辑
根据的评论,即使您这样做,也会发出警告

char a = 'A';
然后传递
a
,因为它无论如何都会被提升到
int
,所以它的意思是

int arg = va_arg(ptr, int);
始终正确,注释中提到的标准部分说明如下

§6.5.2.2

7。如果表示被调用函数的表达式具有包含原型的类型, 参数被隐式地转换为 对应参数,取各参数类型为不合格版本 属于其声明的类型。函数原型声明器中的省略号表示法导致 参数类型转换在最后声明的参数之后停止。默认参数 对尾部参数执行升级

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

void display(int, int, ...);

int main()
{
    display(1,5,1,2,3,4,5);
    display(2,3,'A','B','C');
    printf("\n");
    return 0;
}

void display(int type, int tot_num, ...)
{
    int i, j;
    char c;

    va_list ptr;
    va_start (ptr, tot_num);

    switch(type)
    {
            case 1:
            for (j=0; j<tot_num; j++)
            {
                    i = va_arg (ptr, int);
                    printf("%d ",i);

            }
            break;

            case 2:
            for (j=0; j<tot_num; j++)
            {
                    c = va_arg(ptr, char);
                    printf("%c ",c);
            }
    }
}

据我回忆,字符(您正在传递的)实际上是以int类型存储在C中的。如果这是错误的,我相信有人会纠正我。是的,
'A'
是一个
int
。另外,@LeeDanielCrocker感谢您的链接。但是即使额外的参数是
chara='a'
显示(2,3,a,a,a)
,由于默认参数提升(6.5.2.2函数调用,C11标准第7段),值将作为
int
传递,而不是
char
。@iharob yea检查了它。但在那之后,我有一个问题,比如,“如果我将一个字符传递给一个函数,并将其存储在被调用函数中的一个字符变量中,怎么可能呢?int需要4个字节?char有1个字节?”但我再次想,“等等,字符有1个字节,所以它们最多只能取2(pow)的值8-1,如果我传递一个等于或小于2(pow)8-1的整数,那么我当然可以将它存储在一个char变量中。“我的理解正确吗?@1Byn是的,正确。如果传递的值较大,则会出现问题。但只要值只需要1字节,就不会有问题。