Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

Структуры. Выделение памяти в структуре для строк по указателям

#cpp #структуры


Нашел в интернете такой пример использования структуры

struct building     //Создаем структуру!
{                  
    char *owner;       //здесь будет храниться имя владельца
    char *city;        //название города
    int amountRooms;   //количество комнат
    float price;       //цена
};                 

int main()
{
    building apartment1;   //это объект структуры с типом данных, именем структуры,
building

    apartment1.owner = "Денис"; //заполняем данные о владельце и т.д.
    apartment1.city = "Симферополь";      
    apartment1.amountRooms = 5;
    apartment1.price = 150000;


Для *owner и *city - что-то не вижу выделения памяти, значит ли это, что данные запишутся
хз куда, и не удалятся по завершении программы?
    


Ответы

Ответ 1



Данные останутся на своем месте, т.е. никуда не переместятся и не перезапишутся. В ваших полях owner и city хранятся указатели на них (адреса первых символов). Так что вы не можете их удалять (не вздумайте написать delete[]city, например) - они не были выделены динамически, и не имеете права их перезаписывать (типа city[0]='A') - это строковые литералы.

Ответ 2



Строковый литерал в С и С++ является немодифицируемым объектом типа "массив" со статическим классом памяти. То есть когда вы в своем коде пишете "Симферополь" вы фактически создаете безымянный символьный массив, который фактически является статической переменной. Она существует с самого начала жизни программы и до самого ее конца. Вся необходимая память уже выделена и освобождать ее - не ваша задача.

Ответ 3



по хорошему имя владельца и название города в структуре должны быть константными struct building //Создаем структуру! { const char *owner; //здесь будет храниться имя владельца const char *city; //название города int amountRooms; //количество комнат float price; //цена }; тогда с main() все нормально, так как инициализация есть выделение памяти

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

Отправить комментарий