我不小心让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;
}
2条答案
按热度按时间ddrv8njm1#
正如评论已经暗示的那样,
“我不小心使argc和argv工作”,
但更多
“我偶然使argc和argv工作”。
也就是说,你没有偶然发现一些可靠的工作,
相反,你的代码只是偶然地以不可靠的方式工作。
“未定义行为”的概念是C语言中的一个重要概念。
让自己熟悉它是值得的。这可能是有趣的,例如。读一读“鼻魔”
与你的情况最相关的是,UB可以,除其他外,邪恶地欺骗你相信你的程序工作;我认为这实际上是可能结果中最坏的情况。
由于pmacfarlane的评论中给出的原因,你最终会出现未定义的行为:
你得到了未定义的行为,因为你用错误的参数数量和类型调用test()。
iyfjxgzm2#
必须澄清“工作”的概念。如果你的程序是
p.exe
,如果它 * 工作 *,这意味着在
test
中你需要获得3个参数,一个是p.exe
,argv[0]
中的程序名,还有one
和other
。但你将main声明为int main(void);所以你没有从shell接收到参数。不在
main
中,不在test
中像这样的项目
将作为一个例子
如果你的
p.exe
运行如上argc
和argv[]
只是代码中test
的参数。没有任何东西会将它们与最终在命令行上键入的值联系起来。但是在运行时,这些参数将在内存中有一些地址和一些内容,您的程序可以读取它,甚至不会崩溃。你甚至可以说这是“工作”。