Deep copy v.s. shallow copy
define STR_OUT(X) printf("structure: " #X ": %c, %d, %p, %s, %s, %d\n", X.character, X.strl_len, X.pointer_to_char, X.pointer_to_char, X.char_array, X.instance_of_B.c);
typedef struct B { int c; /* some declarations of B, not important */ } B;
typedef struct A { char character; int strl_len; char *pointer_to_char; char char_array[10]; B instance_of_B; } A;
int main(void) { char v_s[] = "this srting"; A a; A b;
a.character = 'a'; a.pointer_to_char = v_s; a.strl_len = strlen(a.pointer_to_char); a.char_array[0] = 'b'; a.char_array[1] = 'o'; a.char_array[2] = 'o'; a.char_array[3] = 'k'; a.char_array[4] = 0; a.instance_of_B.c = 100;
printf("Step 1\n"); STR_OUT(a); STR_OUT(b);
printf("Step 2\n"); STR_OUT(a); STR_OUT(b);
a.pointer_to_char[0] = 'y'; a.char_array[0] = 'y';
printf("Step 3\n"); STR_OUT(a); STR_OUT(b);
b.pointer_to_char = (char *)malloc(b.strl_len); strcpy(b.pointer_to_char, a.pointer_to_char);
printf("Step 4\n"); STR_OUT(a); STR_OUT(b);
b.pointer_to_char[0] = 'x';
printf("Step 5\n"); STR_OUT(a); STR_OUT(b);
$gcc main.c -Wall -o main $./main '''
Step 1 structure: a: a, 11, 0x22ccd0, this srting, book, 100 structure: b: , 0, 0x0, (null), , 0
Step 2 structure: a: a, 11, 0x22ccd0, this srting, book, 100 structure: b: a, 11, 0x22ccd0, this srting, book, 100
Step 3 structure: a: a, 11, 0x22ccd0, yhis srting, yook, 100 structure: b: a, 11, 0x22ccd0, yhis srting, book, 100
Step 4 structure: a: a, 11, 0x22ccd0, yhis srting, yook, 100 structure: b: a, 11, 0x7c0168, yhis srting, book, 100
Step 5 structure: a: a, 11, 0x22ccd0, yhis srting, yook, 100 structure: b: a, 11, 0x7c0168, xhis srting, book, 100 $