Если я сделал функцию, которая суммирует две переменные и возвращает результат суммирования по указателю.Указатели как возвращаемое значение
Каковы ожидаемые проблемы от этого алгоритма?
Если я сделал функцию, которая суммирует две переменные и возвращает результат суммирования по указателю.Указатели как возвращаемое значение
Каковы ожидаемые проблемы от этого алгоритма?
Нет проблем, если вы делаете это так:
void sum(int a, int b, int *res)
{
*res = a+b;
}
и, например, вызов, как:
int x;
sum(5, 6, &x);
Но ниже не правильно:
int* sum(int a, int b)
{
int *res;
int x = a+b;
res = &x;
return res;// returning address of x - but x is not alive when function ends; don't do it
}
PS. вы также можете использовать malloc
, сохранить результат (a+b
) в этой памяти (назначив a+b
на *res
), а затем верните этот указатель, но затем вызывающему нужно будет его освободить.
Если результат находится в стеке (то есть объявлен локально в вашей функции), тогда указатель будет указывать на переменную, которая будет перезаписана после выполнения дополнительных вызовов функций.
Возможно, он работает в некоторых случаях (т. Е. Сразу же возвращается из функции и захватывает значение до того, как будут перенесены дополнительные кадры стека), но, в общем, это ошибка/ошибочная ошибка.
ожидаемые проблемы
неинициализированные указатель (s)
void add(int a, int b, int * pc)
{
*pc = a + b;
}
int main(void)
{
int a = 1;
int b = 2;
int * pc;
add(a, b, pc);
...
Выпуск: pc
точки "нигде".
плохо выровнена память
void add(int a, int b, int * pc)
{
*pc = a + b;
}
int main(void)
{
int a = 1;
int b = 2;
char c[sizeof (int)];
add(a, b, c); /* or even add(a, b (int*) c); */
...
Проблема: Хотя достаточно большая память для c
не может быть правильно выровнены провести int
.
недействителен памяти
void add(int a, int b, int * pc)
{
int c = a + b;
pc = &c;
}
int main(void)
{
int a = 1;
int b = 2;
int * pc;
add(a, b, pc);
...
Проблема: При возвращении из add()
pc
пунктов недействительных памяти, как уже освобождаться, а именно c
, который жил в стеке add()
«s.
Неопределенное поведение, поскольку вы возвращаете адрес локальной переменной. – Downvoter
Вы просто спрашиваете об «алгоритме», или у вас есть какой-то конкретный код, который вызывает проблемы? Потому что, если у вас есть код, вы должны показать его нам, чтобы мы могли помочь вам решить проблему, с которой вы столкнулись. –
Показать код, поэтому нам не нужно угадывать, в чем проблема. –