Проблема с указателем C — адрес локальной переменной может не попасть в функцию

#c #pointers

#c #указатели

Вопрос:

Вот мой код:

 int* return_to_main()
{
    int george = 32;
    int* pointer;
    pointer = amp;george;
    printf("george address: %pn", (void *)amp;george);
    printf("george content: %dn", *pointer);
    return pointer;
}

int main()
{
    int* test = return_to_main();
    printf("test address: %pn", (void *)amp;test);
    printf("test content: %dn", *test);
}
  

и он возвращает:

 george address: 0061FEE8
george content: 32
test address: 0061FF1C
test content: 6422476
  

CLion сообщает, что «Адрес локальной переменной может не попасть в функцию». Как мне это исправить? И почему переменная george и адрес и содержимое теста разные?
Нормально ли, что адрес переменной george и переменной test разные???

Комментарии:

1. main также выведите test с %p помощью . Кажется, вы путаетесь между местоположением указателя и местоположением, на которое он указывает

2. Спасибо! Я только что изменил на printf("test address: %pn", test); теперь адреса те же, но содержимое по-прежнему отличается

3. george перестает существовать, когда возвращается функция, в которой она была определена. Вот как работают локальные переменные. Вместо этого вы можете вернуть george по значению (что означает, что вызывающий получает копию возвращаемого значения)

Ответ №1:

«Адрес локальной переменной может не попасть в функцию».

Причина этого в том, что вы возвращаете адрес локальной переменной, вы не должны делать этого вместо возврата по значению или использования динамического выделения памяти / глобальной переменной и т. Д.

один из способов устранения вашего предупреждения приведен ниже

 #include <stdio.h>
#include <stdlib.h>

int* return_to_main()
{
    int george = 32;
    int* pointer;
    pointer = malloc(sizeof(int));
    if ( !pointer ) {
        printf("malloc failedn");
        return NULL;
     }
    *pointer = george;
    printf("george address: %pn", (void *)amp;george);
    printf("pointer : %pn", pointer);
    printf("george/pointer content: %dn", *pointer);
    return pointer;
}

int main()
{
    int* test = return_to_main();

    if(test)
    {
        printf("test address: %pn", (void *)test);
        printf("test content: %dn", *test);
        free(test);
        test = NULL;
    }
    return 0;
}
  

Комментарии:

1. Спасибо за объяснение! Просто хочу еще немного разъяснений: если я использую динамическое распределение, почему я должен успешно возвращать содержимое и адрес? Я думал, что динамическое распределение используется для неизвестных размеров

2. речь идет не только об известных размерах, но и о том, хотите ли вы, чтобы ваша память сохранялась до тех пор, пока ваша программа выполняется или пока вы ее не освободите, и доступ к памяти можно получить из любого места в программе, передав или вернув их