например char str[] = "hello world"; совсем не эквивалентен char* str = "hello world"; в первом случае мы аллоцируем блок из 12 байт прямо в области видимости переменной. а во втором - только указатель, который указывает на блок из сегмента статически инициализированных данных

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

  1. Tiny

    Серьезно что ли?

    • Cyberzx

      и эта разница может критичной в программировании МК. что бы не путаться лучше разделять массивы как таковые и указатели на массивы

      • Tiny

        Прикольно) я не знал Даже если включена опция интернирования строк?

        • Cyberzx

          что такое интернирование строк?

          • Tiny

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

            • Cyberzx

              я такой опции не знаю в gcc или clang. но это делается по умолчанию оптимизатором

              • Tiny

                Ну возможно это у меня каша от с#. Там такое точно встречал

                • Cyberzx

                  но вообще да. если у тебя массив объявлен, то ты получаешь именно этот блок памяти. с которым можешь делать всё что угодно

                  • Tiny

                    Ну кстати первый синтаксис мне не нравится. Не очевидно А во втором разве не будет ошибка компилятора? Типо const char* должен быть? Или это уже у меня от с++ деформация?

                    • Cyberzx

                      в gcc вообще весело с этим если у тебя используются похожие строки в коде, в памяти их вообще может не быть. строки будут скливаться на лету из общих блоков, а разница может модифцироваться арифметическими операциями. ох, как-то я пару дней баг в этом чинил ) в Си тип строкового литерала char*, а в С++ - const char*

                      • Tiny

                        бля Я знал что с другой язык

                        • Cyberzx

                          Но при этом модифицировать литерал нельзя. Хоть и есть возможность )

                          • Tiny

                            Ну да. По моему поинтер на конст это чисто плюсовая фишка Даже если строка будет располагаться в защищённой от записи памяти? Мы сейчас в контексте пк или мк?

                            • Cyberzx

                              В любом случае этого делать не стоит, что на МК, что на ПК. на ПК можно схватить acceess violation, если сегмент памяти будет read-only. На МК тоже ничем хорошим это не закончится, если строка будет в ROM, а она скорее всего там и будет.

                              • Tiny

                                Согласен А в какой области работаете?

                                • Cyberzx

                                  gamedev :)

                                  • Tiny

                                    Там на сях пишут?

                                    • Cyberzx

                                      Пишу сервера для онлайн игр на С++ обычно

Не нашли ответ?

Вам также может быть интересно

Ребят, всем привет! Менял стекло на ip8 перестала работать home, поменял подсветку, так де не работает, подкинул 3ью подсветку-аналогично.... Читать далее