我正在为大学做一个特定的项目,其中包括读取输入文本,并基于几个命令生成特定的输出。评分的重点是效率,所以动态内存分配是要走的路,但我对它的了解真的很不稳定。
无论哪种方式,程序都编译得很好,但是当我运行它时,它很快就显示出分段错误,我几乎可以肯定原因是我对内存的处理不当。在我尝试用 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 函数似乎工作正常,所以当我真正开始创建带有行的列表时,事情并不顺利。我很想了解他们不这样做的确切原因,因为我认为我在其余代码中肯定遇到的任何其他问题也与此问题有关。
谢谢你。