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

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

Harvard CS50
2 уровень , 3 лекция
Открыта
  • Текст – 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 в программе не меняются. Это происходит потому, что в функции передаются копии значений переменных. Наберите эту программу, посмотрите на результат, и подумайте, почему он именно такой.

Комментарии (16)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
FeatHonnar Уровень 16
12 сентября 2022
Курс хороший.. Но чересчур он старается учить тебя копаться во всевозможных источниках, чтобы, блин, понять то, что тебе даже близко не объясниили. Или, тем более, без предупреждения исправить нефункионирующий данный код. В итоге, все, что я понял - это то, что можно переместить функции printf непосредственно в функцию swap, что больше похоже на костыль. Либо использовать какие-то абсолютно непонятные мне (ведь о них ни разу не говорили) * и &. Емае
Александр Уровень 25
21 января 2021
1. Программа не скомпилируется если не поменять в третьей строке int на void. Прототип функции должен соответствовать функции. Функция не возвращает никаких значений поэтому void. 2. Код прекрасно иллюстрирует в том числе и структуру стека. Функция swap ничего не передает в main. Значения в swap поменялись, а в main - не изменились. Функция printf берет значения переменных из области значения main. Естественно printf выводит на экран начальные значения переменных x и y.
IamFennics Уровень 4
4 июля 2019
В проге нет ошибок. Она верна. Весь смысл в том, что вызвав функ. 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
немогу просто. нету переведённого доп материала к лекцыям. я готов их пересматривать но я непонимаю половины что они говорят . а вот именно в етом коде я непонял почему в начале обьявляют переменную а и б и как пк поймёт что ети две переменные икс и игрик? и как оно их определит где а а где б . я невидел типа а=x ; b=y . обьясните мне тупню а то я что т застопорилса сильно
Buggi Уровень 0
16 ноября 2018
Все дело в порядке,

void swap(int a, int b)
в swap первым стоит a и b вторым, соотвественно при inpute им значений

int x = 1, y = 2;
     swap(x, y);
так же какую первой напишешь тот будет а и второй b
13 марта 2018
"Поскольку swap получает лишь копии переменных x и y, она не может повлиять на переменные x и y той программы, которая к ней обратилась. Чтобы получить желаемый эффект, вызывающей программе надо передать указатели на те значения, которые должны быть изменены." Это материал из дополнительной литературы, глава 5, параграфы 5.1 и 5.2: http://cpp.com.ru/kr_cbook/ch5kr.html#p51
Константин Уровень 0
19 февраля 2018
Описанная выше, но рабочая (замена 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
Это материал из 1-й и 2-й лекции 4-го уровня.
Akchurin Iskandr Уровень 3
7 октября 2017
CS50 объясняют как сделать, чтоб функция работала. https://www.youtube.com/watch?v=hce6yu8BLEM Вот только не понимаю, где новичку это узнать, чтоб решить самостоятельно? Нужно книгу "Язык программирования с" прочесть? Это такой подход к обучению CS50 или это уже наши курс так срезали? Логичнее было бы предположить, что задания будут в соответствии с изложенным материалом, а не на основе того, что нужно ещё кучу времени изучать самостоятельно.
Roman Уровень 4
24 сентября 2017
Замена int на void, в прототипе функции swap, позволяет скомпилировать программу.
Михаил Уровень 1
23 сентября 2017
Тут ошибка в коде программы Swap. В прототипе написано, что функция не должна выдавать никаких значений, а в прототипе написано, что она должна вернуть int.
Александр Уровень 0
30 сентября 2017
По-моему, в коде функции swap ещё нет return'a, т.е. она пока вообще не передаёт результат работы, но проблема всё равно не в этом - в теле основной программы нет присваивания переменным x и y новых значений из функции swap. Например в программе cube есть строка:

x = cube(x);
А в примере со swap'ом код выглядит так:

int x = 1, y = 2;
     swap(x, y);
     printf("x is %i\n", x);
     printf("y is %i\n", y);
Т.е. функция выполняется и на выходе в ней действительно a = y, b = x, но значения переменных х и y внутри main не меняются. Вот так, например, всё работает:

#include <stdio.h>

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

int main(void)
{
     int x = 1, y = 2;
     swap(x, y);

}

void swap(int a, int b)
{
     int t = a;
     a = b;
     b = t;
     printf("x is %i\n", a);
     printf("y is %i\n", b);
}
Akchurin Iskandr Уровень 3
7 октября 2017
Интересно, что не было точно сказано что нужно сделать. Если переписать функцию, как сделали Вы, то есть сделать так, чтоб ей ничего не нужно было возвращать и внести в её тело и вывод " printf " то можно заставить её работать, но .Давид в CS50 сделал так:

#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;
}


3 ноября 2017
А у вас рабочая версия кода? Потому что у меня всё равно вылезает ошибка error: conflicting types for 'swap' void swap(int* a, int* b)
Akchurin Iskandr Уровень 3
3 ноября 2017
Всё работает. Попробуйте просто скопировать мой код . Чтоб понять как тут идёт передача нужно почитать как работать с указателями.
Виталий Уровень 4
15 марта 2018
в 3 и 13 строке * должно быть (int *a), а не (int* a), b тоже