#c #string #casting #strdup
#c #строка #Кастинг #strdup
Вопрос:
Если входная строка const каким-то образом изменяется (что приводит к предупреждению компилятора C), каков наилучший способ справиться с этим — преобразовать ее в новую переменную, а затем использовать ее ИЛИ дублировать и использовать, а затем освободить ее. Или есть какой-либо другой способ справиться с этим типом сценария. пожалуйста, предложите. Любая помощь будет оценена.
//Типизация
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;
Является ли указанное выше присвоение действительным?
Комментарии:
1. Это зависит от деталей причины, по которой вам нужно изменить постоянную строку.
Ответ №1:
Удаление const здесь может привести к закрытию компилятора, но приведет к сбоям во время выполнения. Сделайте копию строки и поработайте над этим.
Удаление const не копирует содержимое памяти. Он просто создает указатель на ту же память и сообщает компилятору, что он может продолжить и записать в эту память. Если память доступна только для чтения, у вас ошибка защиты. Более серьезно, у вас могут возникнуть проблемы с корректностью, которые трудно отлаживать. Не отбрасывайте const .
Конечно, если вам нужно изменить переменную и сделать эти изменения видимыми для вызывающей стороны, тогда вы не должны делать ее const в первую очередь. С другой стороны, если изменения должны быть частными для функции, то лучше всего дублировать параметр const .
Как правило, вы должны стараться избегать приведений, если это вообще возможно. Приведения являются одним из наиболее частых источников ошибок.
Комментарии:
1. Добавить больше нечего. Например, строковые литералы находятся в памяти только для чтения, и удаление const приведет к сбоям защиты при попытке записи в эту память. Не отбрасывайте const .
Ответ №2:
Если массив, на который s1
указывает is const
, вы не должны его изменять; это приводит к неопределенному поведению. В этом случае, если вам нужно его изменить, вам придется сделать копию. ОБНОВЛЕНИЕ: приведение к типу даст вам указатель на тот же массив, который все еще const
существует, поэтому вы все равно не должны изменять (даже если попытка сделать это больше не выдает ошибку компиляции).
Если вы можете гарантировать, что массив не const
является, то вы можете изменить его, отбросив указатель const
from . В этом случае было бы меньше ошибок, если бы вы могли обеспечить соблюдение этой гарантии, не добавляя const
квалификатор s1
в первую очередь.
Комментарии:
1. в моем случае s1 определенно является const . Итак, вы хотите сказать, что strdup — лучший вариант, чем typecasting?
2. Это именно то, что мы все вам говорим!
3. @user32262: да, типизация указателя даст вам указатель на тот же массив, который вы все равно не должны изменять. Я обновил свой ответ, чтобы уточнить.
Ответ №3:
Если ваш ввод является a const char*
, вам определенно следует прослушать предупреждение компилятора и оставить его в покое.