首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

c语言可变参数的有关问题

2012-03-19 
c语言可变参数的问题看到一个可变参数的函数如下:/*ConcatenatetheNULL-terminatedlistofstringargumentsi

c语言可变参数的问题
看到一个可变参数的函数如下:
/*   Concatenate   the   NULL-terminated   list   of   string   arguments   into
      freshly   allocated   space.     */
char   *
concat_strings   (const   char   *str0,   ...)
{
    va_list   args;
    int   saved_lengths[5];/*   inspired   by   Apache 's   apr_pstrcat   ,   (for   efficiency   matters?)*/
    char   *ret,   *p;

    const   char   *next_str;
    int   total_length   =   0;
    int   argcount;

    /*   Calculate   the   length   of   and   allocate   the   resulting   string.   */

    argcount   =   0;
    va_start   (args,   str0);
    for   (next_str   =   str0;   next_str   !=   NULL;   next_str   =   va_arg   (args,   char   *))
    {
            int   len   =   strlen   (next_str);
            if   (argcount   <   dim   (saved_lengths))
saved_lengths[argcount++]   =   len;
            total_length   +=   len;
    }
    va_end   (args);
    p   =   ret   =   (char   *)malloc   (total_length   +   1);

    /*   Copy   the   strings   into   the   allocated   space.   */
    argcount   =   0;
    va_start   (args,   str0);
    for   (next_str   =   str0;   next_str   !=   NULL;   next_str   =   va_arg   (args,   char   *))
    {
            int   len;
            if   (argcount   <   dim   (saved_lengths))
len   =   saved_lengths[argcount++];
            else
len   =   strlen   (next_str);
            memcpy   (p,   next_str,   len);
            p   +=   len;
    }
    va_end   (args);
    *p   =   '\0 ';

    return   ret;
}

我的疑问是:函数内没有任何语句跟可变参数...联系。va_xxxx系列的函数是怎么知道是对可变参数...进行操作的呢?

[解决办法]
知道最后一个固定参数就能知道可变参数开始的地址,关于到底压了多少参数,其实是不知道的,所以说很危险
[解决办法]
不是这样吧,带可变参数调用函数时,是把参数一个一个压入一个栈里,最后给你一个开头地址你可以根据此
地址一个一个取参数,具体怎么取,有你自己决定,参数什么意义,也有你自己决定.
//你看一下这个函数,不加参数运行一下就知道了.
int main(int argv,char **argc)
{
int i=0;
for(i=0;i <10;i++)
printf( "%s\n ",argc[i]);
}

[解决办法]
这是我写的错误处理函数,变长参数,其实就是K&R中的代码^_^
主意要include <stdarg.h>
18 /***********our error handler***********/
19 void printerr(char *fmt, ...)
20 {
21 va_list args;
22
23 va_start(args, fmt);
24 fprintf(stderr, "error: ");


25 vfprintf(stderr, fmt, args);
26 fprintf(stderr, "\n ");
27 va_end(args);
28 exit(1);
29 }

我的疑问是:函数内没有任何语句跟可变参数...联系。va_xxxx系列的函数是怎么知道是对可变参数...进行操作的呢?

注意函数:va_start(),va_end(),还有va_list类型,这几个就是处理的关键

热点排行