Передача указателей в качестве аргумента - PullRequest
0 голосов
/ 25 апреля 2019
int *tomato(int *a, int *b) {
    int *foo = (int*)malloc(sizeof(int));
    *foo = *a + *b;
    return foo;
}

В этой функции у меня есть foo, который расположен в куче и возвращает указатель на int, но указатели *a и *b в аргументах функции также размещены в куче? Я немного запутался здесь, как правило, аргументы расположены в стеке.

Ответы [ 2 ]

3 голосов
/ 25 апреля 2019

Указатели являются локальными переменными в функции tomato, как и foo.

Значения, на которые они указывают, могут быть размещены где угодно.Например, вы можете назвать это так:

int foo = 1;
int *bar = malloc(sizeof(int));
*bar = 3;
int *result = tomato(&foo, bar);

a будет указывать на переменную foo, а b будет указывать на память, выделенную malloc.

1 голос
/ 25 апреля 2019

Параметры в C не обязательно размещаются в стеке (*), но их scope обязательно будет ограничен функциональным блоком tomato, и они обязательно будут передаваться по значению .

Когда вы разыменовываете a и b в присваивании *foo = *a + *b, вы интерпретируете адрес памяти, хранящийся в указателях a и b, как целые числа, суммируя их и записываярезультат в адресе памяти, сохраненном в указателе foo (который, в вашем примере, оказывается в куче).

После назначения вы можете изменить a и b по желанию с помощьюприсвоение им различных адресов памяти (т. е. указателей), и это не будет иметь никакого значения для любых ссылок на внешнюю память, поскольку их область ограничена функциональным блоком (например, a = foo).Однако, если вы изменили содержимое памяти, на которое они ссылаются (например, *a = 0), это станет видимым вне области действия функции, как если бы вы выполняли запись в пространство памяти (стек или кучу), выделенное где-то еще.

(*) Параметры не могут быть переданы в память (т. Е. В стек) функциям.В зависимости от компилятора / архитектуры они могут быть непосредственно назначены регистру процессора.В любом случае, это прозрачная оптимизация компилятора, и вам не нужно об этом беспокоиться ... параметры будут вести себя одинаково.

...