Я новичок в языке программирования Си.Я вроде понимаю общее определение стековой памяти, кучи памяти, malloc, указателей и адресов памяти.Но я немного ошеломлен пониманием того, когда использовать каждую технику на практике, и разницей между ними.
Я написал три небольшие программы, которые служат примерами.Все они делают одно и то же, и я хотел бы небольшой комментарий и объяснение о в чем разница между ними .Я понимаю, что это наивный вопрос программирования, но я надеюсь соединить здесь несколько основных точек.
Программа 1 :
void B (int* worthRef) {
/* worthRef is a pointer to the
netWorth variable allocated
on the stack in A.
*/
*worthRef = *worthRef + 1;
}
void A() {
int netWorth = 20;
B(&netWorth);
printf("%d", netWorth); // Prints 21
}
int main() {
A();
}
Программа 2:
int B (int worthRef) {
/* worthRef is now a local variable. If
I return it, will it get destroyed
once B finishes execution?
*/
worthRef = worthRef + 1;
return (worthRef);
}
void A() {
int netWorth = 20;
int result = B(netWorth);
printf("%d", result); // Also prints 21
}
int main() {
A();
}
Программа 3 :
void B (int* worthRef) {
/* worthRef is a pointer to the
netWorth variable allocated on
the heap.
*/
*worthRef = *worthRef + 1;
}
void A() {
int *netWorth = (int *) malloc(sizeof(int));
*netWorth = 20;
B(netWorth);
printf("%d", *netWorth); // Also prints 21
free(netWorth);
}
int main() {
A();
}
Пожалуйста, проверьте мое понимание:
- Программа 1 выделяет память в стеке для переменной
netWorth
и использует указатель на этот адрес стековой памяти, чтобы напрямую изменить переменную netWorth
.Это пример передачи по ссылке.Копия переменной netWorth
не производится. - Программа 2 вызывает
B()
, что создает локально сохраненную копию значения netWorth
в ее стековой памяти , увеличивает эту локальную копию, а затем возвращает ее к A()
как result
.Это пример передачи по значению. - Локальная копия
worthRef
уничтожается при возвращении?
- Программа 3 выделяет память в куче для переменной
netWorth
, переменная, и использует указатель на этот адрес памяти кучи, чтобы напрямую изменить переменную netWorth
.Это пример передачи по ссылке.Копия переменной netWorth
не производится.
Моя основная путаница заключается в том, что между Программой 1 и Программой 3. Обе имеют указатели;просто один передает указатель на переменную стека, а другой передает указатель на переменную кучи, верно?Но в этой ситуации зачем мне вообще куча?Я просто хочу иметь единственную функцию для непосредственного изменения одного значения, что я могу сделать без проблем malloc
.
Куча позволяет программисту выбирать время жизни переменной, верно?В каких случаях программист захочет хранить переменную (например, netWorth
в этом случае)?Почему бы просто не сделать ее глобальной переменной в этом случае?