В чем разница между (char *) 'r' и "r"? - PullRequest
0 голосов
/ 10 сентября 2018

Я запутался в различиях между (char*)'r' и "r" и, возможно, (char*)"r", если это отличается от "r".

int main () {
    char fileNameOriginal[MAXLINE] = "test.txt";
    openFile(&fp, fileNameOriginal, (char*)'r');
}
openFile(FILE **fp, char fileName[], char* mode) {
    *fp = fopen(fileName, mode);
}

Этот формат для передачи аргумента режимаfopen не вызовет предупреждение / ошибку моей IDE Eclipse.Тем не менее, файл не будет прочитан правильно.С другой стороны, передача "r" или (char*)"r" приведет к правильному чтению.

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

В Си все символьные литералы действительно int значения. Для систем, использующих систему кодирования ASCII (подавляющее большинство), тогда 'r' равно 114.

Итак, ваш звонок действительно openFile(&fp, fileNameOriginal, (char*)114);, и даже новичок должен понять, что он не совсем правильный.

0 голосов
/ 10 сентября 2018

(char*)'r' - это попытка преобразовать int константу 'r' в указатель char*. Фактическое значение, связанное с 'r', зависит от кодировки , используемой вашей системой.

Когда библиотечная функция пытается разыменовать этот указатель, поведение программы будет undefined .

"r", с другой стороны, имеет тип char[2], который будет затухать до указателя char*, требуемого функцией.

В IDE сложно выдать предупреждение за неправильный случай; и помните, что одним из принципов C является то, что вы предполагаете, что знаете, что делаете!

...