C++ 分段错误中的命令行参数
command line argument in c++ segmentation fault
我正在尝试在 Linux(Ubuntu) 中使用命令行参数 在 c++ 中。 但它会产生运行时错误:分段错误。该程序在 Windows 中运行没有错误。这是我的代码
#include<iostream>
using namespace std;
int main(int argc , char **argv){
char **ss;
for(int i=0;i<argc;i++){
ss[i] = argv[i];
}
for(int i=0;i<argc ;i++)
cout<<ss[i];
return 0;
}
这段代码有什么问题。请帮帮我。提前谢谢。
您的程序具有未定义的行为,因为您没有初始化指针ss
并分配内存,您将要复制 argv 指向的元素
char **ss; // What value does it have?
for(int i=0;i<argc;i++){
ss[i] = argv[i];
您可以通过以下方式进行操作
char **ss = new char *[argc];
for(int i=0;i<argc;i++){
ss[i] = argv[i];
更好的方法是使用 std::vector<std::string>
.在这种情况下,您不仅可以复制指向参数的指针,还可以复制指向参数的指针。例如
#include<iostream>
#include <vector>
#include <string>
int main(int argc , char **argv)
{
std::vector<std::string> v( argv, argv + argc );
for ( const std::string &s : v ) std::cout << s << std::endl;
return 0;
}
如果您的编译器不支持基于范围 for 语句,则可以将其替换为
for ( std::vector<std::string>::size_type i = 0; i < v.size(); i++ )
{
std::cout << v[i] << std::endl;
}
如前所述,您尚未为 ss
分配任何内存。由于您使用的是 c++ 而不是 c,因此您应该可以使用 c++ 标准库:
std::vector<std::string> ss;
ss.reserve(argc); // not necessary
for(int i=0;i<argc;i++)
ss.push_back(argv[i]);
对 ss 使用以下声明
#include<iostream>
using namespace std;
int main(int argc , char **argv){
char *ss[argc]; // <--allocate argc count of pointers
for(int i=0;i<argc;i++){
ss[i] = argv[i];
}
for(int i=0;i<argc ;i++)
cout<<ss[i];
return 0;
}
相关文章:
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- 使用 C++ 将命令行参数拆分为参数/向量
- 如何在OMNET++中添加专门的命令行参数?
- 如何在不传递命令行参数的情况下在 c++ 中设置环境变量
- atoi() 在应用于大型命令行参数时会产生不正确的值
- 命令行参数,cant 或两个变量
- 在 Windows 中使用 boost::p rogram_options 从命令行参数读取 Unicode 字符
- 如何在 Android/NDK 上将命令行参数从 gradlew.bat 传递到 Clang
- 编写一个将 LLVM IR 文件作为命令行参数的程序
- 通过命令行参数获取llvm ir文件时面临问题
- 有没有办法根据命令行参数定义数组大小?运行时与编译时实例化?
- 如何在不使用文件扩展名的情况下使用命令行参数打开C++中的文本文件?
- 命令行参数在不到 3 个 LOC 中 int?
- 在命令行参数中使用引号
- 在VS2013中使用devenv (C++)传递命令行参数argv
- 二进制数据作为命令行参数
- 如何在 C++11 中创建具有命令行参数大小的动态数组?
- 需要有关如何设置getopt_long以正确传递命令行参数的建议
- Bash 脚本和命令行参数