значение структуры не может быть изменено (c язык) - PullRequest
1 голос
/ 19 сентября 2011

Я написал кусок кода c:

struct Res {
    int a;
    float b;
    double c;
};

struct Res ModRes(struct Res rrr)
{
    rrr.a=222;
    return rrr;
}

int main()
{
    struct Res r[10]={1,2,3};
    ModRes(r[0]);
    return 0;
}

почему r[0] не 222 после ModRes?

Ответы [ 4 ]

3 голосов
/ 19 сентября 2011

В C аргументы передаются по значению. Вы можете заставить функцию принимать struct Res * вместо struct Res:

struct Res *ModRes(struct Res *rrr)
{
    rrr->a=222;
    return rrr;
}

int main()
{
    struct Res r[10]={1,2,3};
    ModRes(&r[0]);
    return 0;
}
1 голос
/ 30 августа 2012

Вы объявили ModRes () как функцию, которая принимает по значению структуру типа Res, а затем возвращает структуру типа Res. Однако, когда вы вызвали ModRes () из Main (), вы передали ему структуру типа Res, но ничего не сделали с результатом, который возвратил ModRes (). Итак, r [0] .a не изменилось. Вам нужно изменить вызов на:

r[0] = ModRes( r[0] );

чтобы ваш код работал.

Однако, как указывалось в других ответных сообщениях, есть гораздо лучший способ достичь вашей цели. Вам нужно изменить ModRes, чтобы он мог принимать свой аргумент по ссылке, а не по значению; то есть вам нужно передать ModRes указатель на структуру r [0]. Ваш код должен быть:

void ModRes(struct Res *rrr);   // function prototype

void ModRes(struct Res *rrr)    // function definition
{ 
    rrr->a=222; 
} 

, а затем в Main ():

ModRes(&r[0]);

Количество программных байтов, сгенерированных с помощью этого метода, обычно будет намного меньше, чем число, передавшее аргумент по значению. Этот метод должен передать только один аргумент в ModRes: адрес структуры. Затем ModRes изменяет структуру вызывающей стороны через этот адрес. Он ничего не возвращает, потому что модификация уже была сделана.

Другой метод скопировал все содержимое структуры во временное хранилище (обычно в стек) и вызвал ModRes, который затем изменил элемент a этой копии, изменив его на 222. Затем ModRes вернул эту копию (или копию этого). копировать, в зависимости от вашего компилятора), скопировав его во временное хранилище (обычно в стек) и вернув его вызывающей стороне, которая затем скопирует эту структуру из стека обратно в структуру r [0] вызывающей стороны.

1 голос
/ 19 сентября 2011

Структура передается по значению (копируется) в функцию ModRes.Таким образом, исходное значение не изменилось.

0 голосов
/ 19 сентября 2011

Поскольку вы модифицируете локальную копию, которую функция получает в качестве аргумента.Исследование об указателях.

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