不同类型的可变参数 return 分段错误

Var args of different type return segmentation fault

我有我在可变参数中使用的代码,一个是 long 类型,另一个是 char 数组类型,它被传递给一个参数数量可变的函数 (...),当我尝试检索 char [] 它抛出分段错误。

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

int varargs(int num,...);

int main()
{
   printf("enter fflush\n");
   long opr=77777;
   long *ptr=&opr;
   char env[10]="QATNLO19[=11=]";
   varargs(2,* ptr,env);
   return 0;
}

int varargs(int num,...)
{
    va_list ap;
    va_start(ap,num);
    printf("getting char arg\n"); 
    fflush (stdout);
    char *ptr=va_arg(ap,char *); // segmentation fault at this line 
    printf("char is %s",ptr);
    return 0;
}

你能解释一下为什么这是一个分段错误吗?

传递给函数的第一个可变参数是 *ptr,其类型为 long。您正在尝试将其当作 char * 来阅读。这会触发 undefined behavior.

您需要先阅读 long 参数,然后才能阅读 char *。您还需要在阅读完参数后调用 va_end

long l = va_arg(ap,long);
char *ptr = va_arg(ap,char *);
va_end(ap);