Когда вы передаете структуру, вы передаете ее по значению. Однако матрица внутри него реализована как указатель на указатель на int. Эти указатели являются ссылками, и поэтому, когда вы изменяете значение, на которое они ссылаются в вашей функции, на то же значение ссылается исходная структура в main
.
Если вы хотите передать эти объекты по значению, вам нужно сделать глубокое копирование самостоятельно, в котором вы выделите новую матрицу и скопируете в нее все значения из исходной матрицы.
Как указывает Дрю, в C ++ предпочтительным способом реализации этой глубокой копии является конструктор копирования . Конструктор копирования позволяет выполнять глубокое копирование в любое время, когда объект передается по значению, без необходимости явно копировать объект самостоятельно.
Если вы еще не готовы к классам и конструкторам, вы можете просто написать функцию, возможно Spielfeld copySpielfeld(Spielfeld original)
, которая выполнит эту глубокую копию; по сути он будет таким же, как ваш код инициализации, который вы использовали в своем примере, за исключением того, что он будет принимать значения из переданного Spielfeld
вместо создания нового Spielfeld
. Вы можете вызвать это перед передачей field
в функцию show
или сделать так, чтобы функция show
сделала это для любого переданного аргумента, в зависимости от того, как вы хотите, чтобы ваш API работал.