十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
”变长数组“确实是有的,是在C99标准才出现的。题主的写法没有错。变长指的就是可以用变量指定数组大小,而不是说数组大小可以在runtime改变。(”变长“这个这个翻译很怪啊.....)
成都创新互联服务项目包括德保网站建设、德保网站制作、德保网页制作以及德保网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,德保网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到德保省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
写全的话应该是
int x = 2; //x定义并赋值,当然不一定是2
char array[x];
测试了一下,这样的代码在VC6.0下会报错,因为对C99新标准没有很好地实现。VS2005也不行。VS2013可以正确编译。gcc 3.2.2也可以正确编译。
fmt是第一个参数的首地址。
根据你后面的代码来看,你传递的第一个参数是一个字符串,即%d %d %s\n。你凭什么要认为你的第一个参数是4呢?奇怪……
操作符这里是取fmt的地址,没有涉及引用啊?
转化成char*的意思估计是为了强调你第一个传过去的参数是字符串吧?这种叫做“类型转换”,不会改变fmt里面的数据的,所以肯定不会指向错误的地址,瀑布汗。
最后,+sizeof(fmt)的目的需要肯定,是为了打印出4这个字符来。那么这句话意思就很明白了:首先,将fmt强制转换为char*类型,然后呢,因为fmt已经是char*了,所以移动一个char*那么长的“位置”,来到存储“4”这个数字的地方……再多说一句:你程序里变长参数fmt的结构是“char*,int,int,char*”这样子的,两个char*分别指向两个字符串。
希望你看明白了:D
按照你现在给出的代码,
print2(3, 100, 1, 2, 3);
输出的是1 2 3加上一位不确定值
因为va_start(vl, n);这一步理论上可以得到以a开头的va_list指针,但实际上由于编译器优化,它的效果和va_start(vl, a);是相同的
这一点,你可以打印出指针地址来确定一下
从你的代码推测,你是想让print2打印出后四个参数,包括a在内
即 100 1 2 3
如果是这样 可以用另一种方式做到
print2中,不要调用va_start
而是直接 vl=a;
如下
void print2(int n, int a, ...)
{
va_list vl;
// va_start(vl, n);//使用倒数第二个有名变量
vl = a;//编译器想优化 不让。 直接强势插入
vprint(n+1, vl);
va_end(vl);
}
可以试一下是否是你需要的效果。 如果不是 再追问