Почему я получаю «предупреждение: функция возвращает адрес локальной переменной [-Wreturn-local-addr]» во время компиляции? - PullRequest
0 голосов
/ 30 сентября 2018

Редактировать: отредактировал мой вопрос.Спасибо @SomeProgrammerDude за помощь в понимании того, что я сделал неправильно (я путал массивы и указатели, вот важная тема, которая мне помогла: Разница между типом массива и массивом, выделенным с помощью malloc ).

Допустим, у меня есть массив 'a', объявленный и инициализированный внутри функции, если я объявлю указатель 'b' вне функции и попытаюсь вернуть 'a', приведенный в качестве указателя:

uint8_t *b;

uint8_t * foo(void){
    unint8_t a[size] = {'a', 'b', ...};

    return (uint8_t *) a;
}

b = foo(b);

Почему я получаю:

warning: function returns address of local variable [-Wreturn-local-addr]

1 Ответ

0 голосов
/ 30 сентября 2018

Я тут немного догадываюсь, так как не совсем понятно, о чем вы задаетесь вопросом, но я думаю, что вы спрашиваете, если a и b оба указывают на одну и ту же память после назначения c = a?

В этом случае ответ - да.

+---+     +-------------------------------+
| a | --> | Memory allocated by malloc... |
+---+     +-------------------------------+

Если мы посмотрим на это графически, после a = malloc(...) у вас будет что-то вроде

+---+     +-------------------------------+
| a | --> | Memory allocated by malloc... |
+---+     +-------------------------------+

Тогдапосле задания c = a у вас есть что-то вроде

+---+
| a | --\
+---+    \     +-------------------------------+
          >--> | Memory allocated by malloc... |
+---+    /     +-------------------------------+
| c | --/
+---+

А после return c с b = foo(b) у вас будет только

+---+     +-------------------------------+
| b | --> | Memory allocated by malloc... |
+---+     +-------------------------------+

Важное примечание: Если вы не знаетеРазмер выделенной памяти другим способом, использование выделенной памяти может быть проблематичным, так как вы не знаете, где это заканчивается.Выход за пределы приводит к неопределенному поведению .

Однако, пока вы находитесь в пределах границ выделенной памяти, вы можете использовать ее любым способомПожалуйста.Вы можете писать в него или читать из него, разыменовав указатель b.


Еще одно важное замечание: передача аргумента в foo не имеет значения, функция fooс таким же успехом можно сделать return a и не возиться с аргументом, и конечный результат (b, указывающий на память) будет таким же:

uint8_t foo(void)
{
    uint8_t *a = malloc(...);
    return a;
}

И переменная aдаже не требуется:

uint8_t foo(void)
{
    return malloc(...);
}

Если обе эти функции указаны выше, конечный результат после b = foo() все равно будет

+---+     +-------------------------------+
| b | --> | Memory allocated by malloc... |
+---+     +-------------------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...