Основная проблема заключается в том, что substr
является локальным по отношению к myFunction
, и после выхода myFunction
он больше не существует, поэтому возвращаемый вами указатель больше не будет действительным.
Во-вторых, вы не используете typedef
правильно. Правильный синтаксис будет
typedef char (*ptr)[20];
Синтаксически, typedef
в основном действует как спецификатор класса хранения, подобный static
или extern
(хотя семантика иная). По сути, вы выясняете объявление для объекта
char (*ptr)[20]; // ptr is a pointer to a 20-element array of char
и затем добавьте к нему typedef
:
typedef char (*ptr)[20];
Каким-то образом myFunction
необходимо выделить память таким образом, чтобы она не уничтожалась при выходе из функции. Вот один из вариантов:
typedef char (*ptr)[20];
ptr myFunction(size_t count)
{
/**
* Dynamically allocate a block of N 20-element arrays of char
*/
ptr p = malloc(sizeof *ptr * count);
return p;
}
int main(void)
{
ptr str = myFunction(10);
size_t i, j;
for (i = 0; i < 10; i++)
for (j = 0; j < 20; j++)
str[i][j] = ...;
...
free(str);
return 0;
}