@JD_2779181,
I don't see anything wrong in your sample code except variable names are incorrectly initialized compared to what you have passed to API.

Yes, you can ignore using ProSelect() if you have array of assembly component feature Ids already. In such case refer below sample code (working at my end):
status = ProMdlCurrentGet(&currMdl);
if(status != PRO_TK_NO_ERROR)
return status;
int *p_feat_id_array;
ProArrayAlloc(0, sizeof(int), 1, (ProArray*)&p_feat_id_array);
int featIDs[] = {40, 41}; //Array of feature Ids
int nFeatIds = { sizeof(featIDs) / sizeof(featIDs[0]) };
for (int i = 0; i < nFeatIds; i++)
{
ProArrayObjectAdd((ProArray*)&p_feat_id_array, PRO_VALUE_UNUSED, 1, &featIDs[i]);
}
ProName w_name = L"COMPONENTS_TOP";
ProGroup r_group;
status = ProLocalGroupCreate((ProSolid)currMdl, p_feat_id_array, nFeatIds, w_name, &r_group);
ProArrayFree((ProArray*)&p_feat_id_array);
ProTreetoolRefresh(currMdl);
Hope this helps. Happy weekend! 😊