sizeof(va_list) = 24 而不是 8

问题描述 投票:0回答:1

根据定义,在stdarg.h中

typedef char* va_list
。所以在ubuntu 20.04 64位gcc 9.4.0中va_list的大小应该是8而不是24,我不知道为什么我得到的va_list的大小是24?

我运行了以下代码:

#include <stdio.h>
#include <stdarg.h>
#include <stddef.h>
void print_num( int count, ...){
        va_list args;
        printf("sizeof(args):%d\n",sizeof(va_list));
        va_start(args,count);
        for( int i = 0; i < count; i++ ){
//            printf("*args = %d\n",va_arg(args,int));
              printf("*args = %d\n",*(int*)args);
              args += 4;
        }
        va_end(args);
}
int main(){
        print_num(5,1,2,3,4,5);
        return 0;
}

我期望 printf 1 2 3 4 5 但我收到错误:

change_function.c:13:8: error: assignment to expression with array type 13 |   args += 4;
于是我用下面的方法打印,但是不知道为什么上面的代码会报错? 我想问题的根源是 va_list 的类型。如果您能帮助我,我将不胜感激。

#include <stdio.h>
#include <stdarg.h>
#include <stddef.h>
void print_num( int count, ...){
        va_list args;
        printf("sizeof(args):%d\n",sizeof(va_list));
        va_start(args,count);
        for( int i = 0; i < count; i++ ){
                printf("*args = %d\n",va_arg(args,int));
//              printf("*args = %d\n",*(int*)args);


//      args += 4;
        }
        va_end(args);
}
int main(){
        print_num(5,1,2,3,4,5);
        return 0;
}

谢谢!!!

c++ c char variadic-functions sizeof
1个回答
0
投票

为什么我得到 va_list 的大小是 24?

您很可能使用标准 abi 的 x86_64 架构。从https://refspecs.linuxbase.org/elf/x86_64-abi-0.99.pdf第53页valist给出为:

typedef struct {
unsigned int gp_offset;
unsigned int fp_offset;
void *overflow_arg_area;
void *reg_save_area;
} va_list[1]

从第 12 页开始,类型

unsigned int
有 4 个字节,64 位架构上的指针有 64 位,因此有 8 个字节。因此,使用此编译器和使用该应用程序二进制接口的编译器选项的架构上的 va_list 的大小为 4+4+8+8 = 24。

© www.soinside.com 2019 - 2024. All rights reserved.