C程序中argc传入值随机异常的技术问询
解决argc输出随机值的问题
嘿,我一眼就瞅出问题出在你的debug函数里了——你用错了可变参数对应的输出函数!
你现在的debug函数里,用fprintf(stdout, format, arg)来处理可变参数,这完全不对。因为arg是va_list类型的对象,普通的fprintf根本不知道怎么解析它,这会导致栈读取混乱,所以你看到的argc才是随机的垃圾值。
正确的做法是用专门处理可变参数的vfprintf函数,它就是为这种场景设计的。修正后的debug函数应该是这样:
void debug(char *format, ...) { if(DEBUG_MODE != 0) return; va_list arg; va_start(arg, format); // 替换成vfprintf,才能正确处理va_list参数 (void) vfprintf(stdout, format, arg); va_end(arg); }
另外提个小细节:你的判断逻辑是DEBUG_MODE非0时就直接返回不输出,如果你本来想的是DEBUG_MODE为0时不输出调试信息,那这里的条件得改成if(DEBUG_MODE == 0) return;,不过这不是导致argc随机的原因,只是个逻辑小提醒。
把debug函数改成这样之后,再运行你的main函数,debug("ARGC %i\n", argc);就能正确输出实际的命令行参数个数了。
内容的提问来源于stack exchange,提问作者Levent Dag
相关产品推荐
相关产品推荐

