【发布时间】:2020-05-19 17:23:09
【问题描述】:
为了解决我的问题here,我想知道是否/如何以char** argv 或char* argv[] 以外的格式定义命令行参数的第二个变量。 The reason 是 pybind11 不允许函数输入中的任何一个。以下是我尝试过的方法:
方法一:
#include <stdio.h>
int main(int argc, int* argv_){
for (int i = 0; i < argc; ++i){
printf("%s\n", (char *)(argv_[i]));
}
}
此方法背后的基本原理是指针本质上是一个整数,通过将地址转换为char 指针,应该能够获取字符串。提前感谢您的支持。
方法二:
#include <stdio.h>
#include <string>
int main(int argc, std::string* argv_){
for (int i = 0; i < argc; ++i){
printf("%s\n", argv_[i].c_str());
}
}
方法三:
#include <stdio.h>
#include <string>
#include <vector>
int main(int argc, std::vector<std::string> argv_){
for (int i = 0; i < argc; ++i){
const char* argv__ = argv_[i].c_str();
printf("%s\n", argv_[i].c_str());
}
}
问题:
不幸的是,上述所有方法都导致了臭名昭著的segmentation fault。
如果您能帮助我了解问题所在(即内存泄漏在哪里)以及如何解决问题,我将不胜感激。
解决方法/破解:
在 cmets 中,有人告诉我,如果使用任何其他形式而不是 main()、main(int argc, char** argv) 或 main(int argc, char* argv[]),它将不可避免地导致 segmentation fault。但是,下面的代码有效:
#include <stdio.h>
int main(int argc, long* argv_){
for (int i = 0; i < argc; ++i){
printf("%s\n", (char *)(argv_[i]));
}
}
这适用于 Ubuntu 最小和 g++ 7.4.0,以及 Windows 10 Visual Studio 2019 编译器。但是,它不能用clang 编译。正如其他人指出的那样,这不是一个解决方案,也是一种非常糟糕的做法。根据编译器、操作系统和内存的当前状态,它可能会导致未定义的行为。这不应该在任何实际代码中使用。任何 C/C++ 代码中的 main 函数必须采用 main()、main(int argc, char** argv) 或 main(int argc, char* argv[]) 的形式。
【问题讨论】:
-
我很困惑。什么都不应该打电话给
main,所以这个问题对我来说没有意义 -
@Foad:实际上并没有混合代码这样的东西。由于您使用的是 C++ 类,因此您正在用 C++ 清楚地编译它。
-
@Foad:无论如何,它们都不是一个可验证的最小完整示例,因为那里没有足够的代码来验证问题。正如所有 cmets 和所有答案中所指出的,
main的使用也增加了很多混乱。如果main不是所讨论的方法,那么混乱就会消失。 -
(ctd.) 由于您根本不会调用
main(如您所说),因此段错误问题与您的实际情况完全无关努力实现;所以为它寻求“解决方案”是没有效率的。 -
唯一不专业的一点是您忽略/不承认您给出的答案。你不要“绕过标准”,句号。接受,如果你愿意,回答你的人确实确实知道我们在说什么,并且确实理解你的问题——甚至比你更好。
标签: c++ segmentation-fault command-line-arguments argv