C - язык передачи по значению.Это означает, что указатели в вашей исходной функции не могут быть изменены при вызове на SomeMethod()
(кстати, C не имеет методов).Вы рушитесь в закомментированных строках, потому что p1
и p2
все еще являются нулевыми указателями в то время.
То же самое касается указателей внутри SomeMethod()
.Ваши строки, прокомментированные prints valid value
, потерпят крах по той же причине, если вы передадите нулевые указатели на SomeMethod()
.Для вас невозможно получить результат, который вы говорите, по крайней мере, учитывая код, который вы показали.Если вы допустили ошибку в своем примере и хотели, чтобы эта строка была:
someMethodThatModifiesThePointers(&p1, &p2);
Это может сработать так, как вы объясните - p1
и p2
затем передаются по ссылке (чтото есть, вы передаете указатель на указатель по значению), и их значения могут быть действительными внутри SomeMethod()
.Однако исходные копии p1
и p2
в вашем верхнем коде все равно будут содержать нулевые указатели.
Вы можете решить проблему, выполнив то же самое - передайте p1
и p2
вSomeMethod()
по ссылке:
SomeMethod(&p1, &p2);
Это изменение потребует от вас внесения некоторых изменений в SomeMethod()
:
void SomeMethod(SomeClass **p1, SomeClass **p2)
{
someMethodThatModifiesThePointers(p1, p2);
printf("P1 total: %d\n", (*p1)->total);
printf("P2 total: %d\n", (*p2)->total);
};
После этого вызова p1
и p2
inВаша верхняя функция будет вести себя так, как вы хотите.