@evg_96

Почему строка объявленная как указатель на char не изменяется, а как массив char изменяется?

Почему если объявить строку как массив то программа работает как ожидается, но если строку объявить как указатель на char, то ничего не срабатывает и выводится неизмененное значение?
#include <stdio.h>
#include <conio.h>
#include <ctype.h>

void change_str(void(*fp)(char *), char * str);
void to_upper(char * str);

int main(int argc, char * argv[])
{
    char str[] = "hello"; // char * str = "hello";

    change_str(to_upper, str);

    _getch();

    return 0;
}

void change_str(void(*fp)(char *), char * str)
{
    (*fp)(str);

    puts(str);
}

void to_upper(char * str)
{
    while (*str)
    {
        *str = toupper(*str);

        str++;
    }
}
  • Вопрос задан
  • 159 просмотров
Пригласить эксперта
Ответы на вопрос 1
@res2001
Developer, ex-admin
Скорее всего потому что в варианте
char * str = "hello";
Сама строка "hello" хранится в памяти "только для чтения", которая выделяется ОС для констант при загрузке программы в память.
В варианте с массивом память выделяется в стеке, соответственно проблемы с изменением нет.
Чтоб перейти на указатель - выделите память динамически и скопируйте туда строку. В конце не забудьте память освободить.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы