Я пытаюсь понять, когда значение переменной изменяется, передавая функцию в C.
Я знаю, что в C есть два способа изменить значение переменной:
- Использование возвращаемого значения функции
- Передача адреса переменной для изменения ее содержимого
Вот код:
// by address
void foo(int *nb)
{
*nb = 10;
}
int main(void)
{
int nb = 5;
foo(&nb);
printf("%i\n", *nb); // It prints 10
}
// Code to explain
void foo(char **tab)
{
tab[2] = "44";
}
void bar(char *str)
{
str[1] = 'a';
}
int main(void)
{
char **tmp = malloc(sizeof(char *) * 4);
char *str = strdup("Hello");
for (int i = 0; i < 3; ++i)
tmp[i] = malloc(3);
tmp[0] = "11";
tmp[1] = "22";
tmp[2] = "33";
tmp[3] = NULL;
foo(tmp); // It modifies tmp's value
bar(str); // It modifies str's value
for (int i = 0; i < 3; ++i)
printf("%s\n", tmp[i]);
printf("%s\n", str);
}
Вывод:
11
22 * 1016 * 44
Привет
Ожидается:
11
22 * 1022 * 33
Здравствуйте
Я ожидал отправить копию нафункция, но в конце, и строка и символ ** изменяются.Почему переменные здесь модифицируются?