Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
.doc
Скачиваний:
4
Добавлен:
23.09.2019
Размер:
440.83 Кб
Скачать

38) Присваивание структур (в2б8, в3б23)

Если тип двух программных объектов одинаков, то один объект можно присвоить другому. По умолчанию, когда один объект присваивается другому, делается поразрядная копия всех данных-членов копируемого объекта. Например, когда структура var1 присваивается структуре var2. То содержимое всех полей структуры var1 копируется в соответствующие поля структуры var2. Это иллюстрируется следующим программным кодом:

#include

#include

struct ex_struct//объявили структурный тип

{int a;

int b;};

void main(){

//объявляем переменную структурного типа и присваиваем ее полям занчение 5

ex_struct var1={5,5};

// объявляем переменную структурного типа

ex_struct var2;

//выводим на экран значение переменной var1

printf("\nvar1.a=%d var1.b=%d",var1.a,var1.b);// на экран выведется var1.a=5 var1.b=5

//присваиваем переменной var2 var1

var2=var1;

//выводим на экран значение переменной var2

printf("\nvar2.a=%d var2.b=%d",var2.a,var2.b); // на экран выведется var2.a=5 var2.b=5

//присваиваем полю a переменной var2 значение 6

var2.a=6;

//выводим на экран значения переменных var1 и var2.

printf("\nvar1.a=%d var1.b=%d",var1.a,var1.b); // на экран выведется var1.a=5 var1.b=5

printf("\nvar2.a=%d var2.b=%d",var2.a,var2.b); // на экран выведется var2.a=6 var2.b=5

}

Таким образом после выполнения операции присваивания два объекта остаются независимыми. На пример изменение поля a переменной var1 не влияет на переменную var2. Однако при присваивании объектов друг другу необходимо быть очень внимательным.

Рассмотрим несколько измененный структурный тип ex_str

struct ex_str //объявили структурный тип

{int *a;// теперь поле a – указатель на переменную целого типа типа

int b;};

void main(){

ex_str var1,var2; //объявили две переменные структурного типа

//инициализируем значения переменной var1

var1.a=(int*)calloc(1,sizeof(int));// выделили память под переменную целого типа

*(var1.a)=5;//присвоили по адресу var1.a значение 5

var1.b=5; // присвоили полю b значение 5.

// выводим на экран значение переменной var1

printf("\n*(var1.a)=%d var1.b=%d",*(var1.a),var1.b);// на экран выведется var1.a=5 var1.b=5

//присваиваем переменной var2 var1

var2=var1;

//выводим на экран значение переменной var2

printf("\n*(var2.a)=%d var2.b=%d",*(var2.a),var2.b);// на экран выведется var2.a=5 var2.b=5

//присваиваем по адресу var2.a значение 6

*(var2.a)=6;

//выводим на экран значения переменных var1 и var2.

printf("\n*(var1.a)=%d var1.b=%d",*(var1.a),var1.b);// на экран выведется var1.a=6 var1.b=5

printf("\n*(var2.a)=%d var2.b=%d",*(var2.a),var2.b);// на экран выведется var2.a=6 var2.b=5

}

Ошибка в этой программе весьма коварна. Когда создаются структурные переменные var1 и var2, то для хранения значения по адресу должна выделяться память. Указатель на выделенную каждому полю память хранится в поле a. Однако когда переменная var1 присваивается переменной var2, то указатель a переменной var1 и указатель a переменной var2 указывает на одну и туже область памяти. Внутреннее представление в памяти переменных var1 и var2 после выполнения операции присваивания проиллюстрировано на рисунке.

Рисунок 1 Внутреннее представление в памяти переменных var1 и var2 после выполнения операции присваивания.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]