为什么argc和argv即使在main函数之外也能工作?

k10s72fa  于 2023-10-16  发布在  其他
关注(0)|答案(2)|浏览(84)

我不小心让argc和argv在main函数之外工作。
下面是重现这个“bug”的代码(用gcc编译):
main.c

#include <stdio.h>

int test(void);

int main(void)
{
    test();
}

test.c

#include <stdio.h>

int test(int argc, char **argv)
{
    printf("argc = %i\n", argc);
    printf("args:\n");
    for (int i = 0; i < argc; i++)
    {
        printf("- %s\n", argv[i]);
    }
    printf("test called\n");
    return 0;
}
ddrv8njm

ddrv8njm1#

正如评论已经暗示的那样,
“我不小心使argc和argv工作”,
但更多
“我偶然使argc和argv工作”。
也就是说,你没有偶然发现一些可靠的工作,
相反,你的代码只是偶然地以不可靠的方式工作。
“未定义行为”的概念是C语言中的一个重要概念。
让自己熟悉它是值得的。这可能是有趣的,例如。读一读“鼻魔”
与你的情况最相关的是,UB可以,除其他外,邪恶地欺骗你相信你的程序工作;我认为这实际上是可能结果中最坏的情况。
由于pmacfarlane的评论中给出的原因,你最终会出现未定义的行为:
你得到了未定义的行为,因为你用错误的参数数量和类型调用test()。

iyfjxgzm

iyfjxgzm2#

必须澄清“工作”的概念。如果你的程序是p.exe

p one other

如果它 * 工作 *,这意味着在test中你需要获得3个参数,一个是p.exeargv[0]中的程序名,还有oneother
但你将main声明为int main(void);所以你没有从shell接收到参数。不在main中,不在test
像这样的项目

#include <stdio.h>
int main(int argc, char** argv)
{
    printf("\n\
\t%d arguments received! Your program is: \"%s\"\n\
\t%d more arguments were provided on the command line\n",
        argc, argv[0], argc-1);
    return 0;
}

将作为一个例子

3 arguments received! Your program is: "C:\SO\p.exe"
        2 more arguments were provided on the command line

如果你的p.exe运行如上
argcargv[]只是代码中test的参数。没有任何东西会将它们与最终在命令行上键入的值联系起来。但是在运行时,这些参数将在内存中有一些地址和一些内容,您的程序可以读取它,甚至不会崩溃。你甚至可以说这是“工作”。

相关问题