Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Изменение строки по указателю


Автор: Hukuma 2.11.2010, 18:15
Здравствуйте. Объясните, пожалуйста, следующее поведение, я туманно представляю себе почему так получается, но сам себя убедить в этом не могу. Мне нужно в функции f изменить строку s так, чтобы при выводе на экран в функции main строки str её значение было "str2"

Код


void f(char *s) {

      s="str2";
      return;
}

int main() {

    char *str="str1";
    f(str);
    printf("str=%s\n",str)
    return 0;

}


в этом случае вывод: str=str1

Если же написать так

Код


void f(char **s) {

      *s="str2";
      return;
}

int main() {

    char *str="str1";
    f(&str);
    printf("str=%s\n",str)
    return 0;

}


то вывод будет str=str2 - то, что мне нужно

конкретно я не понимаю, почему первый вариант кода не срабатывает, я же передаю указатель на строку, затем этот же указатель изменяю в функции -> строка в функции main тоже должна измениться. Или ошибка моих рассуждений в том, что когда я подаю указатель 
на строку в функции f, а затем записываю новое значение в строку, на которую он указывает, то я изменяю копию указателя, которая передается в функцию f? Я же его не разыменовываю -> не обращаюсь к участку памяти, на который указывает указатель s в функции f?

я примерно так объясняю себе то, почему первый вариант не срабатывает, но уверенности нет. Объясните, пожалуйста мне. 




Автор: bsa 2.11.2010, 18:23
Строка 9 твоего кода содержит ошибку, на которую компилятор ради совместимости со старым кодом не особо ругается. Строка в двойных кавычках называется строковым литералом и является КОНСТАНТОЙ (т.е. МЕНЯТЬ ее НЕЛЬЗЯ). Поэтому твою 9-ю строку нужно переписать так:
Код
const char *str="str1";
А дальше уже компилятор тебе все объяснит.

Добавлено через 1 минуту и 3 секунды
Кстати, чтобы все заработало, достаточно написать так:
Код
char str[]="str1";
Но это уже называется по-другому: создать массив символов str и проинициализировать его значением "str1".

Автор: Hukuma 2.11.2010, 18:57
bsa, спасибо за ответ, покопался ещё немного и разобрался. Спасибо за замечание насчет const char, я действительно совсем забыл про это. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)