我试图在c ++中使用Linux(Ubuntu)中的命令行参数。但是它会产生运行时错误:分段错误。这个程序在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;
}
此代码有什么问题。请帮我 。提前谢谢。
答案 0 :(得分:3)
您的程序有未定义的行为,因为您没有初始化指针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;
}
答案 1 :(得分:2)
如前所述,您尚未为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]);
答案 2 :(得分:-1)
对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;
}