Заставить компилятор не использовать раздел .rodata - PullRequest
0 голосов
/ 07 ноября 2011

Есть ли способ заставить gcc поставить

char* str = "Hello";

не в .rodata без изменения этого оператора в

char str[] = "Hello!";

?


Итак, лучший способ сделать это - изменить выражение на char str[].Спасибо всем.

Ответы [ 3 ]

3 голосов
/ 07 ноября 2011

Почему?Попытка изменить строковые литералы приводит к неопределенному поведению.Это злоРассмотрим эту программу:

"hello"[0] = 'y';   // Welcome to Undefined Behavior Land. Enjoy yor stay!
std::cout << "hello" << std::endl;   // Could very will print "yello" now!
1 голос
/ 07 ноября 2011
static char strbuf[] = "Hello";
char *str = strbuf;
0 голосов
/ 07 ноября 2011

Как насчет использования strdup , если он есть на вашей платформе, или реализации его самостоятельно, если его нет?

char *str = strdup("hello world");

Это выделит память (во время выполнения) и скопирует строковый литерал в кусок памяти соответствующего размера, который вы вполне законно можете записать и изменить позже.

Не забудьте free() после использования.

Возможно, вы сможете заставить GCC поместить что-то в определенные разделы по вашему выбору, используя атрибут __attribute__ ((section ("my_section"))) , но вам все равно придется изменить исходный источник, чтобы сделать это так, чтобы вы могли гораздо лучше сделать это "нормальным" способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...