аргумент командной строки в ошибке сегментации c ++

0

Я пытаюсь использовать аргумент командной строки в Linux (Ubuntu) в c++. но он генерирует ошибку времени выполнения: segmentation fault.this эта программа работает без ошибок в окнах. Вот мой код

#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;
}

что не так с этим кодом. пожалуйста помогите. заранее спасибо.

  • 2
    Примите привычку компилировать все предупреждения и информацию об отладке (например, g++ -Wall -g ) и научиться использовать отладчик gdb .
Теги:
command-line
command-line-arguments

3 ответа

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 ( std::vector<std::string>::size_type i = 0; i < v.size(); i++ ) 
   { 
      std::cout << v[i] << std::endl;
   }
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, но есть гораздо более простая альтернатива: std::vector<std::string> ss(argv, argv + argc);
  • 0
    Вероятно, немного менее читабелен для программистов на С ++ без знания фона и, следовательно, незнаком с арифметикой указателей, но на самом деле очень лаконичен. Я буду помнить об этом, когда мне понадобится конвертировать необработанные массивы в мой собственный код.
0

Используйте следующую декларацию для 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;
}
  • 1
    Ваш код не совместим с C ++. В C ++ нет VLA.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню