Типирование строки и strdup - PullRequest
1 голос
/ 11 октября 2011

Если входная константная строка модифицируется каким-либо образом (что приводит к предупреждению компилятора C), каков наилучший способ ее обработки - типизировать ее в новую переменную, а затем использовать ее ИЛИ дублировать и использовать ее изатем освобождая это.Или есть другой способ справиться с этим типом сценария.пожалуйста, предложите.Любая помощь будет оценена.

// Typecasting

const char * s1;
char * s2 = (char *)s1;

// Дубликат и бесплатно

const char * s1;
char * s2  = strdup( s1 );
free(s2)

РЕДАКТИРОВАТЬ: Это компилятор C;не C ++.Я не уверен, что при приведении типов s2 будет новой копией строки s1 или будет указывать на исходную строку s1?

Спасибо за ответы.У меня есть еще одно сомнение -

const char * c1;
const char * c2 = c1;

Является ли указанное выше назначение действительным?

Ответы [ 3 ]

5 голосов
/ 11 октября 2011

Сброс const здесь может привести к отключению компилятора, но приведет к сбоям во время выполнения. Сделайте копию строки и работайте над этим.

Удаление const не копирует содержимое памяти. Он просто создает указатель на ту же самую память и сообщает компилятору, что он может пойти дальше и записать в эту память. Если память только для чтения, у вас есть сбой защиты. Более серьезно, у вас могут быть проблемы с корректностью, которые трудно отладить. Не выбрасывайте const.

Конечно, если вам нужно изменить переменную и сделать эти изменения видимыми для вызывающей стороны, то вам не следует делать это в первую очередь const. С другой стороны, если модификации предназначены для приватной функции, лучше всего дублировать параметр const.

Как правило, вы должны избегать приведений, если это возможно. Приведения являются одним из наиболее частых источников ошибок.

2 голосов
/ 11 октября 2011

Если массив, на который указывает s1, равен const, то вы не должны изменять его; это дает неопределенное поведение. В этом случае, если вам нужно изменить его, вам придется взять копию. ОБНОВЛЕНИЕ: Typecasting даст вам указатель на тот же массив, который все еще const, поэтому вы все равно не должны изменять (даже если попытка сделать это больше не дает ошибку компиляции).

Если вы можете гарантировать, что массив не является const, то вы можете изменить его, отбрасывая const из указателя. В этом случае было бы менее подвержено ошибкам, если бы вы могли применить эту гарантию, не добавляя квалификатор const к s1, во-первых.

0 голосов
/ 11 октября 2011

Если вы вводите const char*, вам определенно следует прослушать предупреждение компилятора и оставить его в покое.

...