Возвращение указателя на локальный объект с автоматическим c сроком хранения функции делает указатель недействительным, потому что локальный объект не будет жив после выхода из функции.
И, во-вторых, тип char**
, тип возвращаемого значения показанной функции и тип char ( * )[LENGTH]
, тип возвращаемого выражения, различаются.
Вы можете динамически размещать в функции массив массивов и возвращать его.
Например,
char (* OpenFile() )[LENGTH] {
char ( * line )[LENGTH] = malloc( HEIGHT * sizeof( char[LENGTH] ) );
//...
retirn line;
}
Этот подход является гибким, поскольку вы можете перераспределить массив внутри функции, если это необходимо.
Или вы можете определить массив с помощью спецификатора хранилища stati c like
char (* OpenFile() )[LENGTH] {
static char line[JEIGHT][LENGTH];
//...
retirn line;
}
Обратите внимание, что это утверждение
line[i][strlen(line[i]) - 1] = '\0';
небезопасно. Не обязательно, чтобы функция fgets добавляла введенную строку с символом новой строки '\n'
. Безопасный подход заключается в следующем
line[i][ strcspn( line[i], "\n" ) ] = '\0';