Почему передача строкового литерала в аргумент char * только иногда приводит к ошибке компилятора?
Я работаю в программах на C и C ++. Мы привыкли компилировать без опции make-strings-writable. Но это получало кучу предупреждений, поэтому я выключил его.
Затем я получил целую кучу ошибок вида «Невозможно преобразовать const char * в char * в аргументе 3 функции foo». Итак, я прошел и сделал много изменений, чтобы исправить их.
Однако сегодня программа CRASHED была вызвана тем, что литерал "" передавался в функцию, которая ожидала символ *, и устанавливал 0-й символ в 0. Он не делал ничего плохого, просто пытался редактировать константу, и сбой.
Мой вопрос, почему это не ошибка компилятора?
В случае, если это имеет значение, это был Mac, скомпилированный с gcc-4.0.
РЕДАКТИРОВАТЬ: добавлен код:
char * host = FindArgDefault("EMailLinkHost", "");
stripCRLF(linkHost, '\n');
где:
char *FindArgDefault(char *argName, char *defVal)
{// simplified
char * val = defVal;
return(val);
}
а также
void stripCRLF(char *str, char delim)
{
char *p, *q;
for (p = q = str; *p; ++p) {
if (*p == 0xd || *p == 0xa) {
if (p[1] == (*p ^ 7)) ++p;
if (delim == -1) *p = delim;
}
*q++ = *p;
}
*q = 0; // DIES HERE
}
Это скомпилировано и работает, пока он не попытался установить * q в 0 ...
РЕДАКТИРОВАТЬ 2:
Кажется, что большинство людей упускают суть моего вопроса. Я знаю, почему char foo [] = "bar" работает. Я знаю, почему char * foo = "bar"; не работает
Мой вопрос в основном касается передачи параметров. Одна вещь, которая приходит мне в голову: «Возможно ли, что это проблема C против C ++?» потому что у меня есть некоторые файлы .c и некоторые файлы .cpp, и вполне возможно, что C это позволяет, а C ++ - нет ... или наоборот ...