Я пытаюсь создать матрицу из произвольных размеров. Я могу сделать это просто, вызвав scanf в главном, а затем назначая матричные элементы в строке за строкой, но пытаясь сделать это в одной функции вне основного (и только если scanf() вызывается вне основного) дает мне ошибку Segfault:Scanf Segfaults Вне main()
int **genmat(int nrow, int ncol){
int i,j;
int **mat = (int**) malloc(sizeof(int)*ncol*nrow);
char rowbuff[16];
for(i=0; i < nrow; i++){
INPUT: scanf("%[^\n]%*c",rowbuff);
if(strlen(rowbuff) != ncol){
printf("Error: Input must be string of length %d\n", ncol);
goto INPUT;
}
else{
for(j=0; j < ncol; j++){
if(rowbuff[j] == '1'){
mat[i][j] = 1;
}
else{
mat[i][j] = 0;
}
}
}
}
return(mat);
}
следующие работы просто отлично:
int *genrow(int ncol, char *rowbuff){
int i;
int *row = malloc(sizeof(int)*ncol);
for(i=0;i<ncol;i++){
row[i] = rowbuff[i]%2;
}
return(row);
}
следующее в моей главной функции для вызова GENROW() для каждой строки матрицы:
for(i=0; i < row; i++){
INPUT: scanf("%[^\n]%*c",rowbuff);
if(strlen(rowbuff) != col){
printf("Error: Input must be string of length %d\n", col);
goto INPUT;
}
else{
int *newrow = genrow(col, rowbuff);
for(j=0; j < col; j++){
matrix[i][j] = newrow[j];
}
free(newrow);
newrow = NULL;
}
}
Почему поведение по-разному в этих двух контекстах?
'int ** mat = (int **) malloc (sizeof (int) * ncol * nrow);' это не делает то, что вы думаете.'mat [i]' приводит к 'int *' (указатель на 'int'), который остается неопределенным. И комментарии к запасу, [прекратить использование функций выделения памяти в программе C] (https://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc). – WhozCraig
И, пожалуйста, никогда не используйте goto и label ... – Fefux
'int ** mat = (int **) malloc (sizeof (int) * ncol * nrow);' должно быть 'int (* mat) [ncol] = malloc (nrow * sizeof * mat); '. – mch