Как удалить переменную в C++? [закрыт]
Закрыт. Этот вопрос необходимо уточнить или дополнить подробностями. Ответы на него в данный момент не принимаются.
Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение.
Закрыт 8 месяцев назад .
Мне хотелось бы чтобы я мог удалить переменную Y и объявить ее заново. У меня есть код:
#include using namespace std; int main() < int Y = 1; // Здесь переменной Y уже не должно существовать. int Y = 12; // Здесь переменной Y уже не должно существовать. string Y = "hello!"; cout
Я пробовал помещать переменную в <> , но тогда она не доступна за ее пределами. Есть ли способы реализовать такое с доступом во всей функции?
Отслеживать
2,252 2 2 золотых знака 10 10 серебряных знаков 37 37 бронзовых знаков
задан 10 мар в 7:09
47 5 5 бронзовых знаков
Так а в чем проблема с областью видимости < >? Если переменная уже не должна существовать то о каком доступе во всей функции может идти речь? А вообще зачем это? Чтобы запутать и себя и других?
10 мар в 7:13
Вы ведь уже об этом спрашивали, но не объяснили, для чего это вам нужно.
10 мар в 7:15
Если честно я сам не знаю зачем, мне просто очень очень очень интересно.
10 мар в 7:16
Может быть, вам нужен язык с динамической типизацией. Однако переиспользование переменных ни к чему хорошему не приведёт
10 мар в 7:18
Во время написания этого вопроса ни одна переменная не пострадала :)
10 мар в 7:20
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Так а в чем проблема с областью видимости < >? Если переменная уже не должна существовать то о каком доступе во всей функции может идти речь? А вообще зачем это? Чтобы запутать и себя и других?
int main() < < int Y = 1; >// Здесь переменной Y уже не должно существовать - выполнено! < int Y = 12; >// Здесь переменной Y уже не должно существовать - выполнено! string Y = "hello!"; // здесь у Y видимость до конца функции. cout
В С/С++ статическая типизация - однажды объявленная переменная не меняет свой тип. Это помогает не допускать ошибок.
Как «забыть» переменную на c/c++?
Как "забыть" переменную на с/с++? Припустим ты использовал переменную, и она тебе больше нигде не нужна, вопрос: как ее удалить?
- Вопрос задан более года назад
- 680 просмотров
Комментировать
Решения вопроса 2
Сергей Горностаев @sergey-gornostaev Куратор тега C
Седой и строгий
Переменные прекращают существование после завершения блока, в котором объявлены. Соответственно, используйте маленькие функции, объявляйте переменные как можно ближе к месту их использования и компилятор обо всём позаботится сам.
Ответ написан более года назад
Комментировать
Нравится 7 Комментировать
skyazimuth @skyazimuth
Во-первых, переменные с модификатором static видны только в модуле в котором объявлены. Хотя, в общем случае, они будут физически храниться всю жизнь программы. Во-вторых, переменные, объявленные внутри блока живут только на время выполнения этого блока, кроме static внутри функции. Грубо говоря, все что внутри фигурных скобок только там и существует. Причем, блок можно создать и в нетипичных местах, например, case 0:
Ответ написан более года назад
Комментировать
Нравится 2 Комментировать
Ответы на вопрос 0
Ваш ответ на вопрос
Войдите, чтобы написать ответ

- Android
- +2 ещё
Почему FindLibrary выдает 0x0?
- 1 подписчик
- вчера
- 62 просмотра
C: чтение, добавление, изменение и удаление переменных окружения (getvar, setvar, unsetenv)
Для работы с переменными используются функции getvar() и setvar() из библиотеки stdlib.h .
Как понятно из названий – функция getvar() используется для получения значения переменной, а setvar() – для добавления или изменения.
Для демонстрации – напишем такой код:
#include #include int main () < char *home, *newvar; // получем занчение переменной $HOME home = getenv("HOME"); // Создаём новую переменную $NEWVAR со значением newvarvalue-1 setenv("NEWVAR", "newvarvalue-1", 0); // записываем занчение $NEWVAR в локальную переменную newvar newvar = getenv("NEWVAR"); printf ("Home: %s, and NEWVAR: %sn", home, newvar); // задаём новое значение переменной, но т.к. int replace = 0 - оно не изменится setenv("NEWVAR", "newvarvalue-2", 0); newvar = getenv("NEWVAR"); printf ("NEWVAR: %sn", newvar); // задаём новое значение переменной, но т.к. int replace = 1 - оно изменится setenv("NEWVAR", "newvarvalue-3", 1); newvar = getenv("NEWVAR"); printf ("NEWVAR: %sn", newvar); return 0; >
И результат выполнения:
$ gcc getenv.c -o getenv
$ ./getenv Home: /home/setevoy, and NEWVAR: newvarvalue-1 NEWVAR: newvarvalue-1 NEWVAR: newvarvalue-3
Для удаления переменных – используется функция unsetenv() .
Перепиешм предыдущий код:
#include #include int main () < char *newvar; // Создаём новую переменную $NEWVAR со значением newvarvalue-1 setenv("NEWVAR", "newvarvalue", 0); // записываем занчение $NEWVAR в локальную переменную newvar newvar = getenv("NEWVAR"); if (newvar) < printf ("NEWVAR: %sn", newvar); >else < printf ("NEWVAR not defined: %sn", newvar); >// удаляем переменную $NEWVAR unsetenv ("NEWVAR"); newvar = getenv("NEWVAR"); if (newvar) < printf ("NEWVAR: %sn", newvar); >else < printf ("NEWVAR not defined: %sn", newvar); >return 0; >
$ ./getenv NEWVAR: newvarvalue NEWVAR not defined: (null)
Удалить переменную в теле программы Си
Я объявляю статическую переменную counter в начале программы в двух первых функциях она нужна, а в третьей она не нужна. Можно ли ее как-то удалить?
Перемещено beastie из general
Caesium137
10.05.19 10:54:27 MSK
← 1 2 →

Во-первых, в development. Во-вторых, Это что, клуб изучения Си?
XMs ★★★★★
( 10.05.19 10:56:30 MSK )

Статическую нет, выделяй динамически, если переменная - экземпляр большой структуры, если это какой-нибудь int, то ваще забей.
Не, поизвращаться на самом деле можно, это же си, но ты что-то делаешь не так. Зачем тебе её удалять и что ты вообще под этим понимаешь?
DELIRIUM ☆☆☆☆☆
( 10.05.19 10:56:32 MSK )
Последнее исправление: DELIRIUM 10.05.19 10:58:55 MSK (всего исправлений: 1)
Ответ на: комментарий от XMs 10.05.19 10:56:30 MSK

Да ладно тебе агриться, с каких пор тут вопросы по сям запрещены?
DELIRIUM ☆☆☆☆☆
( 10.05.19 11:00:22 MSK )
Ответ на: комментарий от DELIRIUM 10.05.19 10:56:32 MSK
Чтобы осталось больше памяти
Caesium137
( 10.05.19 11:00:26 MSK ) автор топика
Я объявляю статическую переменную counter в начале программы
Интересно, что ты понимаешь под «объявляю» и «статическую». Как ты понимаешь это физически?
Deleted
( 10.05.19 11:00:32 MSK )
Ответ на: комментарий от Deleted 10.05.19 11:00:32 MSK
static int counter
Caesium137
( 10.05.19 11:01:00 MSK ) автор топика
Ответ на: комментарий от Caesium137 10.05.19 11:00:26 MSK

Сколько памяти она занимает и сколько у тебя есть? У тебя что, микроконтроллер?
DELIRIUM ☆☆☆☆☆
( 10.05.19 11:01:32 MSK )
Ответ на: комментарий от DELIRIUM 10.05.19 11:01:32 MSK
Да, микроконтроллер Arduino
Caesium137
( 10.05.19 11:02:01 MSK ) автор топика
Ответ на: комментарий от Caesium137 10.05.19 11:01:00 MSK

Ты экономишь 4 байта?
DELIRIUM ☆☆☆☆☆
( 10.05.19 11:02:12 MSK )
Ответ на: комментарий от Caesium137 10.05.19 11:01:00 MSK
Вопрос явно не понят. Что происходит физически?
Deleted
( 10.05.19 11:02:22 MSK )
Ответ на: комментарий от DELIRIUM 10.05.19 11:02:12 MSK
А почему бы и нет?
Caesium137
( 10.05.19 11:02:53 MSK ) автор топика
Ответ на: комментарий от Caesium137 10.05.19 11:02:53 MSK

Потому, что твоё последнее сообщение весит больше))
DELIRIUM ☆☆☆☆☆
( 10.05.19 11:03:46 MSK )
Ответ на: комментарий от DELIRIUM 10.05.19 11:03:46 MSK
Ну, так можно или нет?
Caesium137
( 10.05.19 11:04:27 MSK ) автор топика
Ответ на: комментарий от Caesium137 10.05.19 11:04:27 MSK
Подсказываю: «объявление» - это выделение памяти, где произойдёт это выделение с учётом static?
Deleted
( 10.05.19 11:06:40 MSK )
Ответ на: комментарий от Deleted 10.05.19 11:06:40 MSK
Caesium137
( 10.05.19 11:07:27 MSK ) автор топика
Ответ на: комментарий от Deleted 10.05.19 11:06:40 MSK
Это вообще возможно?
Caesium137
( 10.05.19 11:08:31 MSK ) автор топика
Ответ на: комментарий от Caesium137 10.05.19 11:07:27 MSK
Фактически в «теле» процесса. Пока процесс не завершён, ты ничего назад не получишь.
Deleted
( 10.05.19 11:08:49 MSK )
Ответ на: комментарий от Deleted 10.05.19 11:08:49 MSK
Значит, так сделать нельзя?
Caesium137
( 10.05.19 11:11:17 MSK ) автор топика
Ответ на: комментарий от Caesium137 10.05.19 11:11:17 MSK
Как мне известно, нельзя. Физически не получится.
Deleted
( 10.05.19 11:12:14 MSK )
Ответ на: комментарий от Deleted 10.05.19 11:08:49 MSK

Ну переписать область в сегменте данных можно.
DELIRIUM ☆☆☆☆☆
( 10.05.19 11:12:18 MSK )
Ответ на: комментарий от DELIRIUM 10.05.19 11:12:18 MSK
Можешь дать пример кода?
Caesium137
( 10.05.19 11:12:58 MSK ) автор топика
Ответ на: комментарий от DELIRIUM 10.05.19 11:12:18 MSK
Ну переписать область в сегменте данных можно.
Deleted
( 10.05.19 11:13:12 MSK )
Ответ на: комментарий от Deleted 10.05.19 11:13:12 MSK

Так он так и не ответил, что он понимает под освободить. Он видимо хочет переиспользовать память, переписать это и означает.
DELIRIUM ☆☆☆☆☆
( 10.05.19 11:15:34 MSK )
Ответ на: комментарий от Caesium137 10.05.19 11:12:58 MSK

Нет, гугли. И учти, что это будет системно-зависимо.
DELIRIUM ☆☆☆☆☆
( 10.05.19 11:16:15 MSK )
Ответ на: комментарий от DELIRIUM 10.05.19 11:15:34 MSK
Deleted
( 10.05.19 11:16:43 MSK )
Ответ на: комментарий от Deleted 10.05.19 11:16:43 MSK

Ну тогда ой) вот что я нашёл на со
Assuming you are using gnu tools (gcc, binutils) if you look at the linker scripts the embedded folks use like the gba developers and microcontroller developers using roms (yagarto or devkit-arm for example). In the linker script they surround the segments of interest with variables that they can use elsewhere in their code. For rom based software for example you specify the data segment with a ram AT rom or rom AT ram in the linker script meaning link as if the data segment is in ram at this address space, but also link the data itself into rom at this address space, the boot code then copies the .data segment from the rom to the ram using these variables. I dont see why you couldnt do the same thing to have the compiler/linker tools tell you where stuff is then runtime use those variables to grab the data from memory and save it somewhere to hybernate or shut down and then restore that data from wherever. The variables you use to perform the restore of course should not be part of the .data segment or you trash the variables you are using to restore the segment.
DELIRIUM ☆☆☆☆☆
( 10.05.19 11:18:54 MSK )
Я поставил стул, чтобы сидеть, когда читаю и ем, но когда сплю, он не нужен. Можно ли его как-то выкинуть?
anonymous
( 10.05.19 11:20:27 MSK )
Ответ на: комментарий от anonymous 10.05.19 11:20:27 MSK

Не совсем корректная аналогия, стул ты можешь выкинуть хоть в окно в любой момент.
DELIRIUM ☆☆☆☆☆
( 10.05.19 11:22:24 MSK )
Ответ на: комментарий от DELIRIUM 10.05.19 11:22:24 MSK
стул ты можешь выкинуть хоть в окно в любой момент.
Дополним аналогию. Стул заставлен со всех сторон шкафами. )
Deleted
( 10.05.19 11:23:59 MSK )
Ответ на: комментарий от Deleted 10.05.19 11:23:59 MSK

Шкафы можно отодвинуть)