Является ли это выражение о назначении структуры 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 и безопасно делать? Надеюсь, что вопрос очевиден.
Ответы
Ответ 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
.