In C:
Когда структура отправляется (через параметр) по значению в функцию, создается новая структура, поэтому изменение структуры внутри функции не изменит оригинал структура.
Когда массив отправляется (через параметр) по значению в функцию, создается новый указатель, поэтому изменение массива внутри функции не изменит исходный массив, но изменение значений массива внутри функции (поскольку у нас есть указатель на исходный массив) изменит значения в исходном массиве.
Когда структура с полем массива отправляется (через параметр) по значению в функцию, создается ?????, так что изменение массива (указателя) внутри функции не изменит исходный массив, а изменение значений массива не изменит значения в исходном массиве.
Означает ли третий пункт, что поле массива в структуре при отправке в функцию будет полностью клонировано? Почему вместо этого не используется просто указатель? Что об этом говорит спецификация?
Кусок кода, с которым я играл:
typedef struct {
int value;
int array[3]; /* initialized to 0 by default */
} Struct_t;
void foo(Struct_t structure)
{
printf("-- %p\n", structure.array); /* Pointer to local array */
structure.value = 1;
*structure.array = 1; /* Won't change the original array */
*(structure.array + 1) = 1; /* Won't change the original array */
structure.array[2] = 1; /* Won't change the original array */
}
int main()
{
Struct_t s = { .value = 0 };
foo(s);
printf("-- %p\n", s.array); /* Pointer to original array */
printf("%d\n", s.value);
printf("%d\n", s.array[0]);
printf("%d\n", s.array[1]);
printf("%d\n", s.array[2]);
}
Выход:
-- 0x7ffe8f17d194
-- 0x7ffe8f17d1b4
0
0
0
0