2016-03-11 4 views
1
void func(const char *s){ 
    char *result = new char[strlen(s)]; 
    strcpy(result, "new stuff"); 
    s = result;  
} 

int main(){ 
    const char *str = "old stuff"; 
    func(str); 
    std::cout << str << "\n"; 
    return 0; 
} 

Код выше компилируется без суеты, но str не меняется (по-прежнему печатает «старые вещи»). Почему это? Насколько мне известно, str должен передаваться по ссылке в функцию, и я должен переназначить const char *, чтобы указать на что-то еще.C++: переназначение константного символа в функции

+0

Подсказка: Он передается по значению. – 3442

+0

* Насколько я знаю, str должна передаваться по ссылке в функцию *, как она будет передаваться по ссылке, ее не ссылка – Borgleader

+0

Возможный дубликат [В чем разница между передачей по ссылке или передачей по значению?] (http://stackoverflow.com/questions/373419/whats-the-difference-between-passing-by-reference-vs-passing-by-value) – owacoder

ответ

3

Код выше компилируется без суеты

Это, как ожидается, потому что вы не делаете ничего необычного (кроме утечки памяти, конечно).

но str не меняется (все еще выдает "old stuff"). Почему это?

Это потому, что s из func является копией str указателя из main. Повторное присвоение этого указателя делает то, что раньше было точкой копирования в другое место; однако оригинал остается неизменным.

Насколько я знаю, str должен быть передан по ссылке в функцию, и я должен быть в состоянии переназначить const char *, чтобы указать на что-то другое.

Ничто не передается по ссылке неявно; вы должны указать, что функция принимает свой аргумент по ссылке, иначе он передается по значению. Сюда входят указатели.

Исправление, необходимое для того, чтобы ваша функция выполняла то, что вы ожидаете, очень мала: добавьте амперсанд перед s.

void func(const char *&s){ 
    // Don't forget to add 1 for null terminator 
    char *result = new char[strlen(s)+1]; 
    strcpy(result, "new stuff"); 
    s = result;  
} 

Demo.

+0

спасибо. ясно, что я слишком долго не был в C/C++. – user2871915

1
void func(const char *s){ 
    char *result = new char[strlen(s)]; 
    strcpy(result, "new stuff"); 
    s = result;  
} 

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

Смежные вопросы