为什么这会导致细分错误,而不会呢?

时间:2020-04-07 15:29:01

标签: c

为什么会导致细分错误,

int main(char *argv[]) 
{
    printf("%s\n", argv[0]);
    return 0;
}

为什么不这样做

int main(int argc, char *argv[]) {
    int i = 0;
    printf("\ncmdline args count=%d", argc);

    /* First argument is executable name only */
    printf("\nexe name=%s", argv[0]);

    for (i = 1; i < argc; i++) {
        printf("\narg%d=%s", i, argv[i]);
    }

    printf("\n");
    return 0;
}

我没有区别。但是从C编程的角度来看,我是一个完全的菜鸟。

2 个答案:

答案 0 :(得分:4)

第一个程序的main原型无效:int main(char *argv[])

这具有未定义的行为,在您的情况下是崩溃。

第二个程序正确并且可以按预期执行。

答案 1 :(得分:3)

第一个假定没有有效的实现定义的行为,第一个具有不受支持的main()定义。

根据C11标准:

5.1.2.2.1程序启动

在程序启动时调用的函数名为main。实现没有为此声明任何原型 功能。它的返回类型应为int和 没有参数:

int main(void) { /* ... */ }

或带有两个参数(此处称为argc和argv,尽管可以使用任何名称,因为它们是该函数中的局部变量 声明):

int main(int argc, char *argv[]) { /* ... */ }

或同等学历;或其他实现方式定义的方式。