Для начала функция должна быть объявлена как
FrameNode * createframe( const char name[], const char path[], int duration );
потому что ни name
, ни path
не изменены в функции.
Вы не выделили память для list->name
, list->path
и frame
.
И, кроме того, вместо frame
типа FrameNode *
функция возвращает list
типа Frame *
.
Именованная константа STR_LEN
не имеет большого смысла, когда массив символов выделяется динамически, как в вашем случае с элементами данных name
и path
структуры Frame
.
Сначала вы должны динамически выделить память для объекта типа FrameNode
.
Затем вы должны выделить память для объекта типа Frame
и его элементов данных name
и path
.
Таким образом, определение функции может выглядеть следующим образом.
FrameNode * createframe( const char name[], const char path[], int duration )
{
FrameNode *frame = malloc( sizeof( FrameNode ) );
if ( frame != NULL )
{
char *name_data = NULL;
char *path_data = NULL;
size_t n = strlen( name );
name_data = malloc( n + 1 );
if ( name_data != NULL ) strcpy( name_data, name );
if ( name_data != NULL )
{
n = strlen( path );
path_data = malloc( n + 1 );
if ( path_data != NULL ) strcpy( path_data, path );
}
Frame *list = NULL;
if ( name_data != NULL && path_data != NULL )
{
list = malloc( sizeof( Frame ) );
if ( list != NULL )
{
list->name = name_data;
list->duration = duration;
list->path = path_data;
}
}
if ( list == NULL )
{
free( name_data );
free( path_data );
free( frame );
}
else
{
frame->frame = list;
frame->next = NULL;
}
}
return frame;
}
Если вам действительно нужно ограничить длину динамически размещаемых строк, тогда эти операторы
size_t n = strlen( name );
name_data = malloc( n + 1 );
if ( name_data != NULL ) strcpy( name_data, name );
и
n = strlen( path );
path_data = malloc( n + 1 );
if ( path_data != NULL ) strcpy( path_data, path );
следует заменить на
name_data = malloc( STR_LEN );
if ( name_data != NULL )
{
strncpy( name_data, name, STR_LEN );
name_data[STR_LEN - 1] = '\0';
}
и
path_data = malloc( STR_LEN );
if ( path_data != NULL )
{
strncpy( path_data, path, STR_LEN );
path_data[STR_LEN - 1] = '\0';
}
В противном случае возникнет несоответствие относительно хранимых данных: некоторые узлы будут хранить строки, а другие будут содержать не строки.