Я делаю определенный проект для колледжа, который состоит в чтении входного текста и генерации определенного вывода, основанного на нескольких командах. Фокальной точкой для оценки является эффективность, поэтому динамическое распределение памяти - это путь, но я действительно шатко понимаю это.Ошибка сегментации (сбрасывание ядра) в c-указателях и управлении памятью
В любом случае, программа скомпилирована просто отлично, но когда я ее запустил, она быстро обнаружила ошибку сегментации, и я почти уверен, что причиной является плохое управление памятью. После того, как я пытался диагностировать с GDC, я получил это:
(gdb) run proj
Starting program: /home/dusk/Documents/proj proj
warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7ffff7ffa000
5
hello, I'm me
Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7a681c3 in _IO_vfscanf() from /lib/x86_64-linux-gnu/libc.so.6
(gdb) where
#0 0x00007ffff7a681c3 in _IO_vfscanf() from /lib/x86_64-linux-gnu/libc.so.6
#1 0x00007ffff7a70a22 in __isoc99_scanf()
from /lib/x86_64-linux-gnu/libc.so.6
#2 0x00000000004009a4 in linelist (n=5) at proj.c:79
#3 0x000000000040134b in main() at proj.c:226
Таким образом, очевидно, что проблема (ну ... первая проблема) в функции LineList, которая выглядит следующим образом:
/* Creates a list of strings (each being a line of the input)
implemented with pointers */
char **linelist(int n)
{
char **list;
list = calloc(n, MAX_STR*sizeof(char));
char *input;
int i;
for (i = 0; i < n; i++){
scanf("%s/n", input);
list[i] = input;
}
return list;
}
И это главная функция:
функция/*MAIN*/
int main(){
int linesnum = readlinesnum();
char **lines = linelist(linesnum);
char ***matrix = createmat(linesnum, lines);
char input;
fstruct ignore;
ignore.len = 0;
while (1){
scanf("%c", &input);
if (input == 'f'){
ignore = f(ignore);
}
else if (input == 's'){
s(lines, linesnum);
}
else if (input == 'l'){
l(matrix, lines, linesnum, ignore);
}
else if (input == 'w'){
w(matrix, lines, linesnum, ignore);
}
else if (input == 'h'){
h(matrix, linesnum);
}
else if (input == -1){
break;
}
}
freememory(matrix, lines);
return 0;
}
readlinesnum, кажется, работает хорошо, так что, когда я на самом деле получить создания списка с линиями, что вещи не идут хорошо. Я бы хотел понять, почему именно они этого не делают, поскольку я думаю, что любые другие проблемы, которые я, несомненно, имею в остальной части кода, также связаны с этой проблемой.
спасибо.
В 'linelist' этот' scanf ("% s/n", input); 'записывает в нераспределенную память. –
Какая эффективность - пространство или время? Эффективность времени обычно предполагает использование динамической памяти. –