Это вопрос области действия.
int cat[3]; // declares a local variable cat
Локальные переменные по сравнению с памятью malloc
В стеке существуют локальные переменные.Когда эта функция вернется, эти локальные переменные будут уничтожены.В этот момент адреса, используемые для хранения вашего массива, перерабатываются, поэтому вы не можете ничего гарантировать относительно их содержимого.
Если вы вызовете malloc, вы будете выделять из кучи, поэтому память будет сохраняться дольшевашей функции.
Если функция должна возвращать указатель (в данном случае указатель на int, который является первым адресом целочисленного массива), этот указатель должен указывать на хорошую память.Malloc - способ гарантировать это.
Как избежать Malloc
Вам не нужно вызывать malloc внутри вашей функции (хотя это было бы нормально и целесообразно сделать так).
Кроме того, вы можете передать в свою функцию адрес, который должен содержать эти значения.Ваша функция выполнит работу по вычислению значений и заполнит память по указанному адресу, а затем вернется.
На самом деле это обычная модель.Однако, если вы сделаете это, вы обнаружите, что вам не нужно возвращать адрес, так как вы уже знаете адрес вне функции, которую вы вызываете.Из-за этого чаще возвращать значение, которое указывает на успех или неудачу процедуры, например, int, чем возвращать адрес соответствующих данных.
Таким образом, вызывающая функция может узнать, были ли данные успешно заполнены или произошла ошибка.
#include <stdio.h> // include stdio for the printf function
int rainCats (int *cats); // pass a pointer-to-int to function rainCats
int main (int argc, char *argv[]) {
int cats[3]; // cats is the address to the first element
int success; // declare an int to store the success value
success = rainCats(cats); // pass the address to the function
if (success == 0) {
int i;
for (i=0; i<3; i++) {
printf("cat[%d] is %d \r", i, cats[i]);
getchar();
}
}
return 0;
}
int rainCats (int *cats) {
int i;
for (i=0; i<3; i++) { // put a number in each element of the cats array
cats[i] = i;
}
return 0; // return a zero to signify success
}
Почему это работает
Обратите внимание, что вам никогда не приходилось вызывать malloc здесь, потому что cats [3] было объявлено внутри главной функции.Локальные переменные в main будут уничтожены только при выходе из программы.Если программа не очень проста, malloc будет использоваться для создания и контроля продолжительности жизни структуры данных.
Также обратите внимание, что rainCats жестко задан для возврата 0. Внутри rainCats не происходит ничего, что могло бы привести к сбою.например, попытка доступа к файлу, сетевой запрос или другие выделения памяти.Более сложные программы имеют много причин сбоя, поэтому часто есть веская причина для возврата кода успеха.