2011-12-26 3 views
0

Я хочу назначить строку из командной строки. Но у меня возникла ошибка сегментации. Зачем? вот код:C++, char *, segmentation fault

char* ans; 
cout << "enter string: "; 
cin >> *ans; 

обновление: , как выделить память заранее, если я не знаю, размер входной строки, , как она работает в Струнный класса?

ответ

3

У вас есть указатель, но этот указатель не указывает нигде, где есть место для хранения данных. Используйте std::string вместо:

std::string ans; 
cout << "enter string: "; 
cin >> ans; 

// ... 

ans.c_str(); // returns const char * 
1

Поскольку вы не выделяли какую-либо память ans.
Это приводит к неопределенным поведением, где строка, в которую вводится пользователь, записывается в некоторую память, которая не принадлежит вашей переменной ans, и это приводит к сбою. Лучшим подходом является использование std::string вместо char *.

std::string ans; 
cout << "enter string: "; 
cin >> ans; 
0

Вам нужно выделить память для чтения вашей строки в - в коде ans не инициализировано, и поэтому может указывать на любое случайное место памяти. Это может привести к сбою. Есть ли причина, по которой вы не хотите использовать string?

+0

Я просто играть. решил сделать это с помощью char *. Как я буду выделять память, если не знаю размер входного текста. – ashim

+0

@michael - тогда вы не можете знать. Просто подумайте о том, как выделить «достаточное» пространство или каким-то образом определить размер ввода. –

0
char *ans; 

Определяет указатель, без его инициализации. Указатель указывает только на некоторую область хранения, но не удерживает ее. И не инициализируя его, вы нигде не могли бы разыменовать его.

Вы должны сделать две вещи:

  • Выделяют некоторые хранения. Для этого определите статическую переменную или используйте динамическое хранилище, используя ключевое слово new.

  • Инициализировать указатель по адресу этого хранилища.

Или сделать лучше вещи, не работают с обнаженным указателем на всех и использовать std::string, который будет заботиться обо всех деталях распределения памяти.

0

С помощью команды char* вы пытаетесь записать в память, которой у вас нет, и ОС останавливает ваше приложение, прежде чем оно сможет нанести какой-либо ущерб.

Вместо этого, попробовать что-то вроде:

#include <string> 

std::string ans; 
cout << "enter string: "; 
cin >> ans; 

const char* ans_str = ans.c_str();