c - Why struct shallow copy does not work? -
i'm testing shallow copy struct code:
#include "stdio.h" #include "conio.h" int main() { struct str { char * name; int value; }; struct str str_1 = {"go", 255}; struct str str_2; str_2 = str_1; str_1.name = "back"; printf("%s\n",str_1.name); printf("%s\n",str_2.name); printf("\n"); system("pause"); return 0; } i expected result should be:
back but was:
back go edit: expected because shallow copy, str_1.name , str_2.name should point same place.
edit: , dynamic allocation, got expected:
#include <stdio.h> #include <conio.h> #include <string.h> int main() { struct str { char * name; int value; }; struct str str_1; struct str str_2; str_1.name = (char*) malloc(5); strcpy(str_1.name,"go"); str_2 = str_1; strcpy(str_1.name,"back"); printf("%s\n",str_1.name); printf("%s\n",str_2.name); printf("\n"); system("pause"); return 0; } the result is:
back what misunderstand here ?
take piece of paper , draw think happening @ each step slowly, , should become clear.
let's draw struct str so:
--------------------- | const char * name | --------------------- | int value | --------------------- and let's denote string @ address 0xabcdef10 so:
--0xabcdef10--------------------- | "string\0" | --------------------------------- so, when initialise str_1, need memory location hold "go", lets call 0xaaaaaa00
--0xaaaaaa00--------------------- | "go\0" | --------------------------------- then initialise str_1 pointer that:
struct str str_1 = {"go", 255}; --str_1--------------------------- | const char * name = 0xaaaaaa00 | ---------------------------------- | int value = 255 | ---------------------------------- now take shallow copy of str_1, , call str_2:
--str_2--------------------------- | const char * name = 0xaaaaaa00 | ---------------------------------- | int value = 255 | ---------------------------------- next execute str_1.name = "back";. before, first want create new string. lets put @ 0xbbbbbb00:
--0xbbbbbb00--------------------- | "back\0" | --------------------------------- then assign str_1.name, str_1 looks like:
--str_1--------------------------- | const char * name = 0xbbbbbb00 | ---------------------------------- | int value = 255 | ---------------------------------- note haven't changed str_2.
so, when @ our final "memory", see:
--0xaaaaaa00--------------------- | "go\0" | --------------------------------- .... --0xbbbbbb00--------------------- | "back\0" | --------------------------------- .... --str_1--------------------------- | const char * name = 0xbbbbbb00 | ---------------------------------- | int value = 255 | --str_2--------------------------- | const char * name = 0xaaaaaa00 | ---------------------------------- | int value = 255 | ---------------------------------- so str_1 points @ new string, , str_2 points @ old string.
in case describe dynamic, never update pointers in struct, go through same exercise draw out happens memory in case.
Comments
Post a Comment