JavaRush/Курсы/Harvard CS50/Структура памяти программы

Структура памяти программы

Открыта
  • Текст – Text.
  • Инициализированные данные — Initialized data.
  • Неинициализированные данные — Unitialized data.
  • Куча – Heap.
  • Стек – Stack.
  • Переменные среды — Environment variables.
Структура памяти программы - 1

На прошлой лекции мы рассмотрели программу для нахождения куба числа. Приведём её код ещё раз:

#include &ltstdio.h>

int cube(int input); //Прототип функции cube

int main(void)
{
     int x = 2;
     printf("x is %i\n", x);
     x = cube(x);
     printf("x is %i\n", x);
}

int cube(int input)
{
     int output = input * input * input;
     return output;
}

И на её примере рассмотрим структуру стека:

  • Локальные переменные cube()cube()'s locals
  • Параметры cube()cube()'s parameters
  • Локальные переменные main()main()'s locals
  • Параметры main()main()'s parameters
Структура памяти программы - 2

Когда вы вызываете функцию, ее параметры и локальные переменные располагаются в стеке выше той функции, в которой ее вызвали (cube () расположена выше main ()). Когда функция завершает работу, она передает результат функции, находится ниже в стеке.

Пример

Программа, меняет местами значения переменных x и y

#include &ltstdio.h>

int swap(int a, int b); //Прототип функции swap

int main(void)
{
     int x = 1, y = 2;
     swap(x, y);
     printf("x is %i\n", x);
     printf("y is %i\n", y);
}

void swap(int a, int b)
{
     int tmp = a;
     a = b;
     b = tmp;
}

Эта программа не работает так, как вы ожидаете: переменные x и y в программе не меняются. Это происходит потому, что в функции передаются копии значений переменных. Наберите эту программу, посмотрите на результат, и подумайте, почему он именно такой.

Комментарии (18)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
FeatHonnar
Уровень 16
12 сентября 2022, 10:44
Курс хороший.. Но чересчур он старается учить тебя копаться во всевозможных источниках, чтобы, блин, понять то, что тебе даже близко не объясниили. Или, тем более, без предупреждения исправить нефункионирующий данный код. В итоге, все, что я понял - это то, что можно переместить функции printf непосредственно в функцию swap, что больше похоже на костыль. Либо использовать какие-то абсолютно непонятные мне (ведь о них ни разу не говорили) * и &. Емае
Александр
Уровень 25
21 января 2021, 19:04
1. Программа не скомпилируется если не поменять в третьей строке int на void. Прототип функции должен соответствовать функции. Функция не возвращает никаких значений поэтому void. 2. Код прекрасно иллюстрирует в том числе и структуру стека. Функция swap ничего не передает в main. Значения в swap поменялись, а в main - не изменились. Функция printf берет значения переменных из области значения main. Естественно printf выводит на экран начальные значения переменных x и y.
Александр
Уровень 1
6 сентября 2020, 13:49
Если набирать как в примере, то ошибка выскакивает, но после замены в 3-й строке int на void в результате получается x is 1, y is 2. Не могу понять, что этим добивались авторы? Внизу кто-то писал, что можно строки 9, 10 перенести после 17-й строки и х заменить на а, у на b, то на выходе результат: x is 2, y is 1, то есть они поменялись местами. Что здесь хотели донести авторы? Показать функцию swap? Объясните, пожалуйста, кто знает, спасибо
hidden #2969529
Уровень 1
3 февраля 2022, 19:55
Полагаю, авторы добивались именно этих умозаключений от прочитавших текст.
IamFennics
Уровень 4
4 июля 2019, 12:27
В проге нет ошибок. Она верна. Весь смысл в том, что вызвав функ. swep мы ей передали числа 1 и 2. Функ. swep их приняла и сохранила эти числа в свои, локальные перем. (a и b). И они видны только здесь, только в этой функции. И если после последней команды, строка 17, дописать: printf ("a = %i, b = %i\n", a, b);, то выведутся оба варианта. Первый с (a и b), так как в MAIN сперва вызывается swep строка 8, а затем (x и у) строки 9, 10.
олег сипало
Уровень 0
9 октября 2018, 15:41
немогу просто. нету переведённого доп материала к лекцыям. я готов их пересматривать но я непонимаю половины что они говорят . а вот именно в етом коде я непонял почему в начале обьявляют переменную а и б и как пк поймёт что ети две переменные икс и игрик? и как оно их определит где а а где б . я невидел типа а=x ; b=y . обьясните мне тупню а то я что т застопорилса сильно
Buggi
Уровень 0
16 ноября 2018, 07:37
Все дело в порядке,
void swap(int a, int b)
в swap первым стоит a и b вторым, соотвественно при inpute им значений
int x = 1, y = 2;
     swap(x, y);
так же какую первой напишешь тот будет а и второй b
13 марта 2018, 06:29
"Поскольку swap получает лишь копии переменных x и y, она не может повлиять на переменные x и y той программы, которая к ней обратилась. Чтобы получить желаемый эффект, вызывающей программе надо передать указатели на те значения, которые должны быть изменены." Это материал из дополнительной литературы, глава 5, параграфы 5.1 и 5.2: http://cpp.com.ru/kr_cbook/ch5kr.html#p51
Константин
Уровень 0
19 февраля 2018, 12:46
Описанная выше, но рабочая (замена int на void в прототипе функции): #include <stdio.h> void swap(int a, int b); //Прототип функции swap int main(void) { int x = 1, y = 2; swap(x, y); printf("x is %i\n", x); printf("y is %i\n", y); } void swap(int a, int b) { int tmp = a; a = b; b = tmp; } Исправленная программа, которая всё же производит замену х и у: #include <stdio.h> void swap(int* a, int* b); //Прототип функции swap int main(void) { int x = 1, y = 2; swap(&x, &y); printf("x is %i\n", x); printf("y is %i\n", y); } void swap(int* a, int* b) { int temp = *a; *a = *b; *b = temp; }
Юджин
Уровень 22
31 октября 2017, 20:48
Это материал из 1-й и 2-й лекции 4-го уровня.
Akchurin Iskandr
Уровень 3
7 октября 2017, 16:11
CS50 объясняют как сделать, чтоб функция работала. https://www.youtube.com/watch?v=hce6yu8BLEM Вот только не понимаю, где новичку это узнать, чтоб решить самостоятельно? Нужно книгу "Язык программирования с" прочесть? Это такой подход к обучению CS50 или это уже наши курс так срезали? Логичнее было бы предположить, что задания будут в соответствии с изложенным материалом, а не на основе того, что нужно ещё кучу времени изучать самостоятельно.
Roman
Уровень 4
24 сентября 2017, 19:39
Замена int на void, в прототипе функции swap, позволяет скомпилировать программу.