С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 08.04.2015
Сообщений: 36
1

Объяснить назначение ключевого слова static

27.12.2015, 13:28. Показов 1979. Ответов 40
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Я пытаюсь разобраться с использованием static`a и у меня такой вопрос: будет ли корректно работать программа конвертирования числа в строку , если объявить массив char как static ?
C++
1
2
3
4
5
char * itoa(int x)
{
    static char buffer[20];
/*.....*/
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.12.2015, 13:28
Ответы с готовыми решениями:

Нюансы синтаксиса: объяснить использование ключевого слова typedef в заданном фрагменте кода
Всем привет. Недавно на просторах интернета столкнулся с таким кодом: typedef...

Назначение static ?
Здравствуйте. Я уже прочитал в двух книгах про статик,читал в википедии,но так и не понимаю для...

Объяснить назначение макроса
помогите разобраться для чего может служить подобная конструкция макроса #define MACRO_Z "%_z_%"?

Объяснить назначение элемента кода
C++ зачем запятая перед пабликом? ,public PhysObject

40
585 / 488 / 371
Регистрация: 05.11.2013
Сообщений: 1,267
Записей в блоге: 6
27.12.2015, 13:43 2
static будет означать, что содержимое буфера сохраняется между вызовами. Если он будет заполняться каждый раз с начала и завершаться нуль-терминатором, это ничему не помешает (и ничему не поможет).
Если возвращать указателем адрес нулевого байта этого буфера - могут быть косяки, например
C++
1
2
3
char *ptr1=itoa(12);
//...
char *ptr2=itoa(13);
ptr1 показывает на тот же адрес, что и ptr2, если мы захотим использовать ptr1, чтобы вывести строку "12", будем глубоко неправы
1
0 / 0 / 0
Регистрация: 08.04.2015
Сообщений: 36
27.12.2015, 18:26  [ТС] 3
Цитата Сообщение от ПерС Посмотреть сообщение
будем глубоко неправы
То есть, если я потом захочу использовать функцию ещё раз и там будет меньше знаков, чем размер буфера, то получу ерунду на выходе? если возвращать как
C++
1
return (buffer);
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
27.12.2015, 18:30 4
зачем оно вам? вопрос из ряда про квадратные колёса велосипеду...
0
0 / 0 / 0
Регистрация: 08.04.2015
Сообщений: 36
27.12.2015, 22:02  [ТС] 5
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
зачем оно вам?
Мне и не нужно, есть программа, где массив char объявлён как static, пытаюсь понять, законно это или нет
0
Эксперт С++
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.12.2015, 22:14 6
Цитата Сообщение от KFu14 Посмотреть сообщение
есть программа, где массив char объявлён как static, пытаюсь понять, законно это или нет
если утрировать, тогда:

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

а поскольку время их жизни до конца программы,
то такие переменные сохраняют своё значение
между вызовами функции-хозяина.

воспринимайте локальный статик просто как переменную,
которая не умирает по завершению работы функции
1
806 / 533 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
27.12.2015, 22:18 7
KFu14, эх, у ключевого слова static много ролей
Пока что ты узнал только одну)
0
0 / 0 / 0
Регистрация: 08.04.2015
Сообщений: 36
27.12.2015, 23:43  [ТС] 8
Цитата Сообщение от hoggy Посмотреть сообщение
воспринимайте локальный статик просто как переменную,
которая не умирает по завершению работы функции
Спасибо ! То есть, если я два раза подряд вызову эту функцию, то она будет работать нормально?
0
393 / 165 / 32
Регистрация: 10.12.2015
Сообщений: 717
27.12.2015, 23:49 9
Цитата Сообщение от KFu14 Посмотреть сообщение
если я два раза подряд вызову эту функцию, то она будет работать нормально?
Если она написана нормально то и работать будет нормально. Первая ссылка поиска http://ic.asf.ru/~/docs/cpp/cppd_qualifier.htm
0
5232 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
28.12.2015, 08:11 10
Цитата Сообщение от KFu14 Посмотреть сообщение
если я два раза подряд вызову эту функцию, то она будет работать нормально?
Работать будет нормально, результат может быть не нормальный (см. пост #2). Если массив используется вообще для каких-то своих внутренних целей, то беспокоится не о чем до тех пор, пока ты вызываешь эту ф-цию из 2х разных потоков.
1
0 / 0 / 0
Регистрация: 08.04.2015
Сообщений: 36
28.12.2015, 12:58  [ТС] 11
Цитата Сообщение от Kastaneda Посмотреть сообщение
Работать будет нормально, результат может быть не нормальный (см. пост #2). Если массив используется вообще для каких-то своих внутренних целей, то беспокоится не о чем до тех пор, пока ты вызываешь эту ф-цию из 2х разных потоков.
Понял, благодарю.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
28.12.2015, 13:05 12
Цитата Сообщение от Kastaneda Посмотреть сообщение
до тех пор, пока ты вызываешь эту ф-цию из 2х разных потоков
Даже если перед обращением(рабоет с) к данной переменной использовать mutex или critial zone(или как там). Если я понял проблему описанную вами, то она появится везде где потоки используют одно адрессное пространство для чтения/записи.
0
5232 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
28.12.2015, 13:12 13
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Даже если перед обращением(рабоет с) к данной переменной использовать mutex или critial zone(или как там).
Ну если внутренний буфер используется для каких-то внутренних целей, то синхронизация поможет. Например
C++
1
2
3
4
5
6
7
8
{
    // лочим mutex
    char buf[] = ....
    // что-то пишем в буфер
    std::string result(buf);
    // разлочили mutex
    return result;
}

Не по теме:

вот это

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
(рабоет с)
не осилил :)

1
rikimaru2013
28.12.2015, 13:14
  #14

Не по теме:

Цитата Сообщение от Kastaneda Посмотреть сообщение
не осилил
решил дописать, чтобы не тыкнули носом, что только при чтение с разных потоков - всё будет хорошо, а так слово "работает" подразумивает еще и запись.

0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
28.12.2015, 14:15 15
Цитата Сообщение от KFu14 Посмотреть сообщение
Мне и не нужно, есть программа, где массив char объявлён как static, пытаюсь понять, законно это или нет
Законно в том смысле, что до сих пор используется в темном наследии Си. Например, ctime грешит подобным. Причем, альтернативы ctime использующей заданный пользователем буфер (ctime(&time,user_buf);) нет и не предвидится. Видимо, библиотеки Си как мумии - не обновляются.
Другое дело, что подражать этим мумиям не есть гуд, ибо могут обнаружиться неожиданные грабли.
0
393 / 165 / 32
Регистрация: 10.12.2015
Сообщений: 717
28.12.2015, 14:21 16
Цитата Сообщение от Renji Посмотреть сообщение
Видимо, библиотеки Си как мумии - не обновляются
А разве в этом есть необходимость? Для байтослесарства более чем достаточно.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
28.12.2015, 14:30 17
Цитата Сообщение от cyber-satyr Посмотреть сообщение
А разве в этом есть необходимость?
Есть - ctime потокобезопасность (thread-safety) не дает, ибо два параллельных вызова стукнутся лбами ломанувшись в один общий static буффер. Во времена однопоточных мумий это было не слишком актуально, но времена то немного изменились.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
28.12.2015, 14:31 18
Renji, а разве с появлением потоков не вышли классы работы с временем в стандр библиотеках?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
28.12.2015, 14:36 19
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Renji, а разве с появлением потоков не вышли классы работы с временем в стандр библиотеках?
Эти классы переводят время в текст через все тот же ctime. Альтернативы ctime в std::chrono почему-то так и не внесли.
0
Эксперт С++
8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
28.12.2015, 14:40 20
Цитата Сообщение от Renji Посмотреть сообщение
в темном наследии Си.
темное наследние си - это морально устаревшие глобальные переменные,
с сопутствующим extern

которое привело к возниконвению статических членов классов - костыльное прошлое с++.

локальные статики - это настоящее и будущие с++.

локальный статик - черезвычайно постребованная на практике конструкция.

собственно, это единственный способ
построить безопасные сингелтоны,
которые в автоматическом режиме,
практически без участия человека,
самостоятельно разрулят собственное время жизни,
и проблемы возможных созависимостей,
поимев иммунитет против static order initialization fiasco,
0
28.12.2015, 14:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.12.2015, 14:40
Помогаю со студенческими работами здесь

Объяснить назначение функций getchar и putchar
Всем привет!) Объясните, пожалуйста, для чего нужна функция getchar и putchar максимально понятным...

Объяснить назначение и работу статического метода
Объясните, пожалуйста, как работает статический метод и для чего он нужен, вот пример: class...

Объяснить назначение и нюансы работы функции strtok()
Что делает это? for (char *p = strtok(str, del); p; p = strtok(NULL, del)) а именно ; p; p =...

Объяснить назначение функции length(), принимающей в качестве аргумента std::vector
Добрый день! Подскажите, пожалуйста. Есть такая переменная: vector<float> Yvect C тремя...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru