Кроме возвращаемого значения, должен ли адрес переменной отправляться в функцию для изменения ее значения в C? - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь понять, когда значение переменной изменяется, передавая функцию в 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
Здравствуйте

Я ожидал отправить копию нафункция, но в конце, и строка и символ ** изменяются.Почему переменные здесь модифицируются?

1 Ответ

0 голосов
/ 15 февраля 2019

Ваш комментарий к foo(tmp) говорит: «Он изменяет значение tmp», но это не правильно.tmp является указателем, и значение указателя не изменяется foo.Вызов foo(tmp) передает значение tmp в foo, а затем foo изменяет то, на что он указывает.Это меняет tmp[2], чтобы указать "44".tmp[2] является одной из вещей, на которые указывает tmp;это не tmp.

Аналогично, в bar(str), str является указателем, и значение указателя не изменяется var.Скорее, bar изменяет один из символов в строке, на которые указывает str.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...