В стандарте ISO C99 говорится о строковых литералах (раздел 6.4.5 / 6):
Не определено, различаются ли эти массивы при условии, что их элементы имеют
соответствующие значения. Если программа пытается изменить такой массив, поведение
не определено.
Это потому, что, как правило, все строковые литералы объединены в одну область, которая может быть помечена только для чтения, и иногда они объединяются для экономии места. Другими словами, два строковых литерала:
char *p1 = "Googolplex";
char *p2 = "plex";
может храниться таким образом:
+--- p1 p2 ---+
| |
V V
+---+---+---+---+---+---+---+---+---+---+----+
| G | o | o | g | o | l | p | l | e | x | \0 |
+---+---+---+---+---+---+---+---+---+---+----+
Это значит: не пытайтесь их модифицировать. Он может работать в определенных ситуациях, но на это не стоит полагаться, если вы хоть немного цените переносимость.
Изменение:
char *str_1 = "Hello";
до:
char str_1[] = "Hello";
, так как это фактически совпадает с:
char str_1[6];
strcpy (str_1, "Hello");