#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. речь идет не только об известных размерах, но и о том, хотите ли вы, чтобы ваша память сохранялась до тех пор, пока ваша программа выполняется или пока вы ее не освободите, и доступ к памяти можно получить из любого места в программе, передав или вернув их