C:命令行的参数是二进制的,与局部变量与二进制不同



i具有long long参数的C程序。当我尝试将这漫长的二进制表示形式转换为二进制表示。但是,如果我设置一个等于long long参数值的long long变量,那么我会得到正确的二进制表示。

  int main(int argv, long long value)
{
        long long i = value; // value = 2
        long long e = 2;
        printBits(sizeof(e), &e); // 0000000000000000000000000000000000000000000000000000000000000010
        printBits(sizeof(i), &i); // 0000000000000000011111111111110000010000111010101110101000001000
        return 0;
}

因此,您可以在上面看到通过控制台检索的参数,因为输入与应有的位置相近。

printbits()是该解决方案的复制糊。

有人可以清除发生的事情吗?

main的签名是

int main(int argc, char** argv)

不幸的是,c编译器可以很宽松,所以可能发生的是您指向char*的指针默默地施放给long long,导致胡说八道。

您需要实际解析参数,例如使用strtoll

与没有-Wall编译器标志的C一起使用CAISS问题。启用了所有警告后,您将立即找到该问题:

warning: second argument of ‘main’ should be ‘char **’ [-Wmain]
int main (int argc, long long value)
    ^~~~

您代码中 main()的签名

 int main(int argv, long long value)

对于托管环境而言是无效的,是错误的。第二个参数应该为char **类型。通过将argc等效定义为long long,您正在尝试将char **类型接收到long long类型中,该类型会导致不确定的行为,因为它们不是兼容类型。

换句话说,所提供的命令行参数作为指向字符串的指针。您需要应用适当的转换才能使它们回到long long或任何其他兼容类型。 strtoll() 只是为此目的而制造的。

引用C11,第§5.1.2.2.1章,

在程序启动时调用的函数命名为main。实施声明否 此功能的原型。它应使用int的返回类型定义,没有 参数:

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

或两个参数(此处称为argcargv,尽管任何名称都可能是 使用,因为它们是声明的函数的本地):

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

或等效; 10)或其他某些实现方式。

和,第2段,

- 如果argc的值大于零,则数组成员argv[0]通过 argv[argc-1]包含在弦上的指针, 在程序启动之前,主机环境实现定义的值。这 意图是在计划启动之前确定的程序信息 来自托管环境中的其他地方。如果主机环境没有能力 在大写和小写中都提供字母 应确保以小写为单位接收字符串。

- 如果argc的值大于零,则字符串指向argv [0] 代表程序名称;如果argv[0][0]为null字符,如果 程序名称在主机环境中不可用。如果argc的值为 大于一个,通过argv[1]通过argv[argc-1]指向的字符串 表示程序参数。

相关内容

  • 没有找到相关文章

最新更新