Вероятно, это не тот случай в коде, на который вы ссылались, но вам также нужен двойной указатель всякий раз, когда вы хотите передать указатель на функцию и отразить изменения этого указателя вне области действия этой функции.
Например, если вы пытались переписать функцию strcpy, чтобы пользователю не приходилось выделять память для исходной строки, вы можете попробовать что-то вроде следующего:
void MyStrcpy(char* dst, char* src){
dst = (char*)malloc(sizeof(char)*(strlen(src)+1));
for(int i=0;i<=strlen(src);i++)
dst[i] = src[i];
printf("src: %s ", src);
printf("dst: %s\n\n", dst);
}
Если бы вы тогда вызывали эту функцию,
int main() {
char *foo = "foo";
char *newPtr;
MyStrcpy(newPtr, foo);
printf("foo: %s ", foo);
printf("new: %s\n", newPtr);
}
Ваш вывод будет следующим:
источник: foo
dst: foo
foo: foo
новый:
Вы также можете получить ошибку сегмента при попытке печати newPtr, в зависимости от вашей системы. Причина такого поведения точно такая же, как и причина, по которой вы не ожидаете, что изменение int, переданное по значению в функцию, будет отражено вне этой функции: то, что вы передаете MyStrcpy, это просто адрес памяти, ссылки на newPtr. Когда вы выделяете пространство для dst внутри функции, вы меняете адрес, на который указывает dst. Это изменение не будет отражено за пределами MyStrcpy!
Вместо этого, если вы хотите, чтобы newPtr указывал на новый выделенный фрагмент памяти, вы должны иметь указатель dst на указатель, символ **.
void MyStrcpy(char** dst, char* src){
*dst = (char*)malloc(sizeof(char)*(strlen(src)+1));
for(int i=0;i<=strlen(src);i++)
(*dst)[i] = src[i];
printf("src: %s ", src);
printf("dst: %s\n\n", *dst);
}
Теперь, если бы вы вызвали эту функцию:
int main() {
char *foo = "foo";
char *newPtr;
MyStrcpy(&newPtr, foo);
printf("foo: %s ", foo);
printf("new: %s\n", newPtr);
}
Вы получите ожидаемый результат:
src: foo
dst: foo
foo: foo
new: foo
Надеюсь, это поможет!