LINUX.ORG.RU

Как узнать на изменяемую ли память указывает переменная?

 


1

2

Вот такой код

	char *s = "change me :)";
	s[0] = 'k';
вызывает ошибку сегментации.

Внимание, вопрос: что в чёрном ящике
Есть ли способ узнать на какой «тип» памяти указывает переменная?
Ну, то есть, можно ли её менять или нет.

★★★

Последнее исправление: LinuxUser (всего исправлений: 1)

Ответ на: комментарий от LinuxUser

добавь в структуру поле «значение по умолчанию»

struct param_value {
	char *p;
        char *d; //<- значение по умолчанию
	char *v;
} cfg[CFG_N];

или можно сделать кривущщее решение - при загрузке перетащить всё в кучу

__attribute__((constructor)) void prepare_config() {
  int i;
  for(i=0;i<CFG_N;i++)
     if (cfg[i].v) cfg[i].v=strdup(cfg[i].v);
}

MKuznetsov ★★★★★
()
Ответ на: комментарий от LinuxUser

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

Ну добавь флаг.

Но это, на мой взгляд, не красиво.

А ну тот кастыль, что ты запостил - это типа красиво?

TrueTsar1C
()
Ответ на: комментарий от LinuxUser

Лол, я-то думал, у тебя что-то серьёзное. А тут просто делай strdup.

mix_mix ★★★★★
()
Ответ на: комментарий от intelfx

+1, param_value должна знать является ли *v статичной строкой или уникальной из кучи.

motto
()
Ответ на: комментарий от TrueTsar1C

А ну тот кастыль, что ты запостил - это типа красиво?

Почему это костыль? Всё вполне корректно и лишние сущности не создаются.

LinuxUser ★★★
() автор топика

Есть ли способ узнать на какой «тип» памяти указывает переменная?

gcc -S явно показывает, что строчка у тебя в

.section	.rodata

Можешь написать так:

char s[] = "change me :)";

или, вероятно, так:

char * c = strdup("change me :)");
Freyr69 ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.