char * для строкового литерала? - PullRequest
2 голосов
/ 17 октября 2010

var1 должен содержать строку независимо от того, пуста она или нет, иначе моя программа будет работать с ошибкой. Но gcc жалуется, что пустой строковый литерал постоянен, а var1 - нет. Ниже приведен пример того, о чем я говорю.

Как я могу это исправить?

предупреждение: присвоение отбрасывает квалификаторы из целевого типа указателя

char *var1 = NULL;
if(var1 == NULL)
{
    var1 = malloc(strlen(var2) + 1);
    strcpy(var1, var2);
}else{
    var1 = ""; // warning points here
}

EDIT:

Строковые литералы не могут быть изменены, поэтому я использую этот флаг, чтобы предупредить меня:

-Wwrite-строки

Ответы [ 4 ]

2 голосов
/ 17 октября 2010

Чтобы назначить пустую строку, сделайте что-то вроде этого:

var1 = malloc(1); /* 1 byte */
var1[0] = '\0';
2 голосов
/ 17 октября 2010

Строковый литерал имеет тип char[].При использовании в большинстве контекстов строковый литерал (типа char[]) затухает до указателя на свой первый элемент (он становится типом char*).

Если ваш компилятор жалуется на присвоение значениятипа char* (ваш "") для объекта типа char* (ваш var1), ваш компилятор сломан.

Или, скорее всего, вы его не вызываетекак компилятор 'C', но как компилятор языка, похожего на C, но не совсем C.

Попробуйте: gcc -Wno-write-strings ..., чтобы отключить это конкретное расширение gcc: -)


Редактировать

Строковый литерал - это массив символов (типа char[]), но его нельзя изменить.По историческим (или некоторым другим специфическим) причинам они не относятся к типу const char[], так как «массив неизменяемых символов» выглядит так, как и должно быть.

С опцией компилятора «-Wwrite-strings» gcc пытаетсябыть полезным и изменить определение строковых литералов.

Если вы хотите быть в безопасности и хотите, чтобы ваши строковые литералы были типа const char[], просто помните, что вы больше не компилируете C (C89, C90, C99,что угодно) и будь счастлив.Как сказали другие ответы: объявите ваши указатели как const или скопируйте неизменяемые символы в изменяемые объекты.

0 голосов
/ 17 октября 2010

Строковые литералы имеют тип const char * (или, возможно, const char []) в последних версиях C. Небезопасно назначать строковый литерал для char *, потому что изменение этого char * приводит к неопределенному поведению, отраженному в их const типа.

0 голосов
/ 17 октября 2010

Объявление var1 как константы:

const char *var1 = NULL;

Значение const означает, что вы не измените содержимое указанного объекта (например, вы не попытаетесь изменить содержимое строкового литерала). Вы все еще можете изменить то, на что указывает переменная.

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