Строковые литералы: куда они идут?

Вы можете использовать console.profile в firebug

148
задан Community 23 May 2017 в 12:18
поделиться

4 ответа

Обычно строковые литералы помещаются в раздел «данные только для чтения», который отображается в пространство процесса как доступный только для чтения (вот почему вы можете ' t изменить это).

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

Вместо этого попробуйте придумать трюк, чтобы сделать строковые литералы изменяемыми (это будет сильно зависеть от вашей платформы и может измениться со временем), просто используйте массивы:

char foo[] = "...";

Компилятор организует инициализацию массива из литерал, и вы можете изменить массив.

122
ответ дан 23 November 2019 в 22:00
поделиться

На этот вопрос нет единого ответа. Стандарты C и C++ просто говорят, что строковые литералы имеют статическую длительность хранения, любая попытка их модификации дает неопределенное поведение, а несколько строковых литералов с одинаковым содержимым могут разделять или не разделять одно и то же хранилище.

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

Определение деталей также зависит от платформы - большинство, вероятно, включает инструменты, которые могут сказать вам, куда он их помещает. Некоторые даже дают вам контроль над подобными деталями, если вы этого хотите (например, gnu ld позволяет вам предоставить скрипт, который расскажет вам о том, как группировать данные, код и т.д.)

.
50
ответ дан 23 November 2019 в 22:00
поделиться

gcc создает раздел .rodata , который отображается «где-то» в адресном пространстве и помечается только для чтения,

Visual C ++ ( cl.exe ) создает ] .rdata для той же цели.

Вы можете посмотреть вывод dumpbin или objdump (в Linux), чтобы увидеть разделы вашего исполняемого файла.

Например.

>dumpbin vec1.exe
Microsoft (R) COFF/PE Dumper Version 8.00.50727.762
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file vec1.exe

File Type: EXECUTABLE IMAGE

  Summary

        4000 .data
        5000 .rdata  <-- here are strings and other read-only stuff.
       14000 .text
14
ответ дан 23 November 2019 в 22:00
поделиться

Это зависит от формата вашего исполняемого файла. Если бы вы программировали на ассемблере, вы могли бы поместить строковые литералы в сегмент данных вашей ассемблерной программы. Ваш компилятор языка C делает нечто подобное, но все зависит от того, для какой системы компилируется ваш двоичный файл.

4
ответ дан 23 November 2019 в 22:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: