細かいですが、ちょっと個人的にメモしておきたい違い。
1 2 3 | char *s = "abcdef"; strcpy(s, "ghijkl"); printf("%s",s); |
このコードは動きません。理由は、”abcdef” が string literal で read-only のため。s ポインターはこの string literal を指しているので、strcpy() に渡しても、エラーになります。つまり、s は、
1 | const char *s = "abcdef"; |
と同じ。
それに対して、
1 2 3 | char s[] = "abcdef"; strcpy(s, "ghijkl"); printf("%s",s); |
は期待した通りの結果を返します。こちらの s は、char の配列を定義してます。そして、これはスタックにロードされるので、変更可能。