Обратите внимание, что myStruct * s[2]
просто объявляет массив из 2 унитизированных указателей (на структуры типа myStruct).
Указатели могут очень хорошо указывать на недопустимую память, к которой вы обращаетесь в init_struct
следующим выражением: (*s)->a
(что, если вы еще не знали, эквивалентно s[0]->
).
Вы можете исправить недопустимый доступ к памяти, выделив память, необходимую для структуры:
s[0] = malloc(sizeof s[0]);
Вы также должны проверить, удалось ли malloc
выделить память:
if (s[0] == NULL) {
return; // error
}
Тогда вы можете свободно писать неинициализированным членам myStruct
, которые вы только что выделили:
s[0]->a = 10;
Обратите внимание, что в вашем приложении будет утечка памяти, если только вы не освободите выделенную память:
free(s[0]);
Кроме того, вы можете проверять наличие ошибок, используя очень полезный инструмент valgrind, который должен дать вам следующий вывод:
$ valgrind ./a.out
==12820== Memcheck, a memory error detector
==12820== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==12820== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info
==12820== Command: ./a.out
==12820==
==12820==
==12820== HEAP SUMMARY:
==12820== in use at exit: 0 bytes in 0 blocks
==12820== total heap usage: 1 allocs, 1 frees, 8 bytes allocated
==12820==
==12820== All heap blocks were freed -- no leaks are possible
==12820==
==12820== For counts of detected and suppressed errors, rerun with: -v
==12820== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)