Подтвердить что ты не робот

Является ли это выражение о назначении структуры C законным?

Вот пример кода, за которым следует мой вопрос:

#include <stdio.h>
#include <string.h>

struct st {

    char stringField[100];
    int intField;
};

typedef struct st st;

void test(st *parameterStruct)
{
    st localStruct;
    strcpy(localStruct.stringField, "HELLO");
    localStruct.intField = 5;

    *parameterStruct = localStruct;
}

int main()
{
    st myStruct;
    strcpy( myStruct.stringField, "XXX" );
    myStruct.intField = 9;

    printf("%s,%i\n", myStruct.stringField, myStruct.intField );

    test(&myStruct);

    printf("%s,%i\n", myStruct.stringField, myStruct.intField);

    return 0;
}

ВЫВОД:

XXX,9
HELLO,5

Я думал, что, поскольку структура "localStruct" была создана внутри функции (не используя malloc), у нее была локальная область действия, и поэтому места памяти, в которых она была сохранена, были свободны переопределить после прекращения выполнения функции. Тем не менее, я попытался запустить эту пробную программу, и она выполнена без проблем. Я думал, что второй оператор печати собирается печатать тарабарщину на экране, так как я назначил "myStruct" локальной переменной "localStruct" (по сравнению с "localStruct" , динамически распределенной). Я знаю, что если localStruct был создан с использованием malloc, таких проблем не было.

Мой вопрос: назначает структурную переменную 'myStruct' (не динамическую локальную переменную) на y с помощью указателя в функции test okay и безопасно делать? Надеюсь, что вопрос очевиден.

4b9b3361

Ответ 1

Назначение всегда копируется.

Если вы сделали что-то вроде *x = &y (предполагая соответствие типов - если параметр был объявлен как st** x, например), вы будете копировать адрес y, но поскольку y выйдет в ближайшее время это назначение будет опасным, как вы опасались.

Но так как вы делаете *x = y вместо этого (где объявлен параметр st* x), вы копируете содержимое y в *x, поэтому даже после того, как y выходит за пределы области видимости, данные, хранящиеся в *x, должны быть действительными.

Ответ 2

Да. Это безопасно.

При назначении:

*x = y;

Члены y копируются в соответствующие члены *x. Он работает так, как будто вы сами сделали копию члена.

Ответ 3

C разрешить назначение структуры. Две структуры могут быть назначены, если они имеют совместимый тип. Две структуры , объявленные одновременно, совместимы, а структуры , объявленные с использованием одного и того же "тега структуры" или же имя типа, также совместимы.

В приведенном примере обе версии *x и y объявлены с использованием одного и того же имени типа структуры st, оба являются совместимыми и, следовательно, назначение *x = y является законным. Поскольку st x в main создает структуру, которая имеет полный тип, передача ее адреса функции является законной. В вашей функции назначение *x = y просто копирует содержимое локальной переменной y в *x, и это изменение на *x сохраняется и отражается на x в main.