C++, что происходит при увеличении char *
Скажем, у меня есть следующий код:
void incrementPointer( const char *x) {
char *localVar = new char;
char *localVarPtr = localVar;
while(*xPtr != '\0') {
xPtr++;
localVarPtr++;
}
}
Допустим, что x указывает на какое-то завершенное нулем слово. После выполнения цикла while localVarPtr указывает на местоположение, которое не было выделено для localVar? Например, если я объявлю какую-то другую переменную в этой функции, а затем установлю все байты между localVar и localVarPtr на символ 'c', это может перезаписать значение другой переменной?
Мой другой вопрос: если это считается плохой практикой (то есть потенциально может перезаписывать переменные или вызывать неопределенное поведение), каким образом будет выделяться достаточно места для localVar, если x указывает на слово, размер которого неограничен? Размер x может быть больше, чем целое число без знака, и поэтому я не смог бы использовать размер при инициализации localVar.
1 ответ
Допустим, что x указывает на какое-то завершенное нулем слово. После выполнения цикла while localVarPtr указывает на местоположение, которое не было выделено для localVar?
Это полностью зависит от длины x - если, например, x содержит только нулевой терминатор, то no, значение localVarPtr указывает на начало области, выделенной new.
Например, если я объявлю какую-то другую переменную в этой функции, а затем установлю все байты между localVar и localVarPtr на символ 'c', это может перезаписать значение другой переменной?
Вы не изменяете память, сохраненную в любом из адресов, поэтому нет, перезапись не произойдет. Если ваш localVarPtr указывает на регион, скажем, по адресу 0x8000, и вы затем изменяете 0x8010, предполагая, что 0x0810 является "локальной переменной", тогда да, его содержимое будет изменено. Это дикий запад, любой действительный (или иногда недействительный) адрес, на который разыменована и назначен, изменится или подаст сигнал.
Мой другой вопрос, если это считается плохой практикой (то есть потенциально может перезаписывать переменные или вызывать неопределенное поведение),
Да, обычно указание или изменение неопределенной памяти - плохая практика. Однако указатель на локальную переменную, намеренно установленный таким образом, вполне подойдет. Неопределенное поведение всегда плохая практика.
Каков был бы способ выделить достаточно места для localVar, если x указывает на слово, размер которого неограничен? Размер x может быть больше, чем целое число без знака, и поэтому я не смог бы использовать размер при инициализации localVar.
Как отметил Мат, нет такого способа иметь строку "неограниченной" длины. Если вам нужно выделить пространство, соответствующее размеру строки для x, вам нужно просто узнать размер, либо вызвав функцию для определения ее длины, либо передав ее в эту функцию. Как только вы знаете размер, вы можете использовать новый, чтобы выделить его.