С объявлением qwe *p = NULL;
вы объявляете не массив указателей, а фактический struct
.Но в foo
вы разыменовываете содержимое массива как указатель, и это неверно.Ваш подход можно переписать так:
for (int i = 0; i<SIZE; i++) {
(*out)[i].a = i;
(*out)[i].b = _strdup("Hello");
}
Другой подход, который делает разыменование лучше читаемым (на мой взгляд), заключается в передаче ссылки на массив:
void foo1(qwe *& out) {
out = (qwe*)malloc(SIZE * sizeof(qwe));
for (int i = 0; i<SIZE; i++) {
out[i].a = i;
out[i].b = _strdup("Hello");
}
}