C 中的命令行参数,无法理解其行为

标签 c command-line

我有以下代码:

#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/

相关文章:

php - 从 PHP 向命令行程序发送输入

java - 在 Windows 命令行中将 Jar 文件添加到构建路径

c# - cmd.exe shell 的输入和输出

c++ - 用最少/一行代码更新一维数组的多个位置

c - poll 和 epoll 事件标志兼容吗?

c - 从 char 响应缓冲区中提取 JSON 文本

java - 这两个命令行执行.jar的区别?

android - 从 native c 代码执行 Android 应用程序

c - 如何将文件中的所有数字读取到数组中?

java - 使用空格在 Java 中创建新的 Firefox 配置文件?