2014-10-09 2 views
0

Я нашел это поведение прямо сейчас, в недавнем gcc.Deep Copy of Struct Member Arrays

Является ли такое глубокое копирование гарантированным поведением стандартом C/C++, на что можно положиться?

[edit] И какова логика такого поведения? Объекты массива C при копировании с оператором = или в качестве аргумента функции всегда будут считаться простым указателем. Чем отличаются члены структуры?

#include <stdio.h> 
#include <stdlib.h> 

typedef struct 
{ 
    int arr[5]; 
} 
array; 

int main(void) 
{ 
    array a = {{ 1, 2, 3, 4, 5}}; 
    array b; 
    int i; 

    b = a; 
    b.arr[0] = 0; 
    b.arr[1] = 0; 
    for (i = 0; i < 5; i++) 
    { 
     printf("%d %d\n", a.arr[i], b.arr[i]); 
    } 
    return EXIT_SUCCESS; 
} 

выход будет,

1 0 
2 0 
3 3 
4 4 
5 5 
+0

Да, это гарантировано. Это не «глубокое» копирование. Это просто «копирование». – juanchopanza

+0

Вы не должны задавать вопрос о двух разных языках, должно быть два разных вопроса, если вы обойдетесь обоим. – Vality

+1

@Vality Будет ли ответ другим, если этот _специфический вопрос был задан только для одного из языков? – xiver77

ответ

2

Да, это действительно гарантировано поведение. Массив: не указатель. Массив - непрерывная последовательность элементов, а его значение - значение всех его элементов. Поэтому копирование массива должно означать копирование всех его элементов.

Вы говорите, что объекты C, скопированные с помощью = или как аргументы функции, всегда рассматриваются как указатель. Это не совсем правильно - массивы C (и C++) не могут быть скопированы на =. И функции не могут иметь параметры (или возвращаемые типы) типа массива - они всегда настраиваются на тип указателя. И аргументы функции типа массива претерпевают преобразование массива в указатель для соответствия.

Итак, основное правило: массивы копируются по значению. Часть исключений состоит в том, что функции не могут иметь параметры (и возвращаемые значения) типа массива, вместо этого вместо этого используются указатели.

+0

Массивы не могут быть скопированы по значению, но происходит то, что одни и те же правила копирования применяются рекурсивно к членам. Итак, что происходит, это 'b.arr [0] = a.arr [0]; b.arr [1] = a.arr [1]; 'и т.д. –