Почему передача строкового литерала в аргумент 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 ++ - нет ... или наоборот ...

Ответы на вопрос(6)

Ваш ответ на вопрос