[C言語] Cプログラミングの落とし穴 7.6 メモリ番地0 P99

『Cプログラミングの落とし穴』(A.コーニグ, 1990)
[M1 Mac, Big Sur 11.7.2, clang 13.0.0, NO IDE]

本の内容からの派生でchar*とchar[]のメモリアドレスと値、および代入・一部書き換えの可否を調べました。結果は以下の通りです。

char* : 代入可、一部書き換え不可
char[] : 代入不可、一部書き換え可

char*では静的領域にある定数のアドレスがスタック領域に格納され、char[]では定数がそのままスタック領域にコピーされます。

#include <stdio.h>

int main() {
    char *p1 = "abc";
    char p2[] = "xyz";

    printf("p1 : %s\n", p1);
    printf("*p1 %c\n", *p1);
    
    // p1[0] = 'd'; 定数領域の書き換えになるため"Bus error: 10"になる

    printf("p2 : %s\n", p2);
    printf("*p2 %c\n", *p2);

    return 0;
}
p1 : abc
*p1 a
p2 : xyz
*p2 x