2015-02-11 3 views
-1

Я читаю в своем приложении и помещаю его в указатель. Я использовал таНос, так что я не уверен, что неправильноОшибка сегментации (сбрасывается ядром) при печати информации указателя

КОД:

#define BUFFER 30 //in my .h file 

char *inStr; 
inStr = malloc(sizeof(char*)*BUFFER); 
scanw("%s", &inStr); 
inStr[strlen(inStr)] = '\0'; 
mvwprintw(stdscr, 0, 0, "%s",inStr); 

Я пытаюсь вывести его на борт Ncurses, и я не знаю, почему это происходит. Он падает, когда я нажимаю ввести для ввода

+0

Что такое 'buffer'? Каково это содержание? Откуда вы знаете, что 'malloc()' был успешным? Что попадает в 'inStr'? Зачем даже писать 'inStr [strlen (inStr)] = '\ 0';' – John3136

+0

'sizeof (char *)'? Что такое «БУФЕР»? –

+1

Ты что-то сделал, хорошо. Вы уверены, что 'char *' не должен быть 'char'? Четвертая строка кажется совершенно бесполезной, поскольку 'scanw' должен прервать эту строку для вас (как вы думаете,' strlen' будет работать, если он не *?). И это: 'scanw («% s », & inStr);' должен быть 'scanw («% s », inStr);' – WhozCraig

ответ

3

Первый пункт, для формата A «% S», вам необходимо передать указатель на буфер. Фактически вы передаете указатель на указатель на буфер. Снимите &. Во-вторых, strlen определяется наличием нулевого значения в конце, поэтому использование его для определения того, где положить нуль, немного бессмысленно. Вместо этого вы должны доверять scanw, чтобы закончить его правильно. Обратите внимание, что это ОГРОМНОЕ предположение и является большой частью того, почему вся семья scanf встревожена переполнениями буфера - функция не знает, насколько велик буфер. Кроме того, как отмечают другие, размер вашего malloc отключен - вы, вероятно, просто хотите что-то вроде malloc(BUFFER) - размер примечания size (char) равен 1 по определению.

char *inStr; 
inStr = malloc(BUFFER); 
scanw("%s", inStr); 
mvwprintw(stdscr, 0, 0, "%s",inStr); 
+0

Я думаю, что это была часть, которая его закручивала, спасибо! – Exikle

0

Переключаю:

malloc(sizeof(char)*BUFFER)