Есть несколько проблем:
void foo(char *foo, int baa)
{
if (baa)
foo = "ab";
else
foo = "cb";
}
Этот код изменяет локальный указатель, но ничего с ним не делает. Чтобы скопировать строки, вам нужно использовать strcpy()
, чтобы интерфейс оставался прежним:
void foo(char *foo, int baa)
{
if (baa)
strcpy(foo, "ab");
else
strcpy(foo, "cb");
}
Однако, прежде чем сделать это, вам нужно убедиться, что foo
в функции указывает на изменяемую память. Код вызова необходимо изменить, чтобы обеспечить:
char x[] = "baa";
foo(x, 1);
printf("%s\n", x);
Кроме того, вы можете сохранить x
в качестве указателя и изменить интерфейс функции:
void foo(char **foo, int baa)
{
if (baa)
*foo = "ab";
else
*foo = "cb";
}
и вызывающая последовательность:
char *x = "baa";
foo(&x, 1);
printf("%s\n", x);
Оба механизма работают, но делают это по-разному. Есть разные наборы проблем с каждым. Не существует единственного решения «это лучше, чем это»; что лучше, зависит от обстоятельств, выходящих за рамки показанных фрагментов кода.