Причина, по которой он не работает, заключается в том, что аргументы функции в C копируются. Итак, nCheck = NULL во внешнем контексте, вы передаете его в функцию CallIntAllocation, и создается копия. CallIntAllocation определяет, что его локальная копия nCheck является возвращением вызова malloc. Но внешняя копия не обновляется - она по-прежнему указывает на NULL.
Самое простое решение - вернуть новое значение указателя и назначить его, как уже было предложено несколькими людьми.
Когда у вас есть функции, которые должны изменять структуры данных, вам нужно передавать указатель на них, а не их копии, чтобы функция могла изменить то, на что указывает указатель. Здесь применяется тот же принцип, хотя структура данных, которую вы хотите изменить, сама по себе является указателем.
Таким образом, другое решение было бы для CallIntAllocation взять указатель на указатель, который позволил бы вам изменять, куда указывает указатель, а также разыменовывать его:
CallIntAllocation(int** nCheck, int nCount)
{
*nCheck = (int*)malloc(nCount* sizeof(int));
for (int j = 0; j < nCount; j++)
(*nCheck)[j] = 0;
}
и вызов
CallIntAllocation(&nCheck, nCount);
Очевидно, что в этой ситуации возврат нового значения указателя является разумным подходом.
Конечный пункт: если он у вас есть, вместо цикла «for» можно использовать «memset» (C90, но не C89 afaik, однако часть спецификации unix)
memset(ncheck, 0, nCount);
(это для вашей версии функции, а не для той, которая принимает аргумент int **)