我有以下代码:
#include <stdio.h>
int main(int argc, char* argv[]){
int a = argv[1]?atoi(argv[1]):10;
int b = argv[2]?atoi(argv[2]):20;
printf("a = %d, b = %d\n", a, b);
return 0;
}
如果我不提供任何命令行输入,“a”和“b”中的值
应该分别为 10 和 20,但实际上“a”的值为 10 而“b”的值为 0。
我不明白为什么会这样,因为我做的完全一样
两种情况下的事情。
谢谢。
最佳答案
运行时(通常通过 crt0 & kernel )保证(根据 C99 或 POSIX 标准)(对于 main
的参数 argc
& argv
):
argc
是积极的argv
是一个有效的非NULL
指向argc+1
数组的指针指针argv[argc]
是NULL
指针对于每个
i
介于 0 和argc-1
之间包括,argv[i]
是一个(有效的非NULL
)指针,指向一个以零结尾的字符串因此可以访问
argv[j]
与j>argc
(或j<0
)是 undefined behavior (UB) - 因此只有深入研究实现细节才能解释发生的事情......有效
argv[i]
不是 pointer aliases , 所以如果i
&j
都在 0 和argc-1
之间包括,和i
!=j
,argv[i]
!=argv[j]
因此,当 argc==1
时,您的代码是错误的因为正在访问 argv[2]
被禁止 (UB)。
你应该编码:
int main(int argc, char* argv[]){
int a = (argc>1)?atoi(argv[1]):10;
int b = (argc>2)?atoi(argv[2]):20;
非常 scared未定义的行为(另见引用文献 here )。遗憾的是,带有 UB 的程序可能有时看起来“工作”(即可能不会崩溃)。但在其他时候可能会发生不好的事情。所以你应该做最坏的打算。
关于C 中的命令行参数,无法理解其行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35498135/