見出し画像

C : pointer initialized by String literals is Write-protected

pointerを文字列で初期化

char* p = "breakfast";

とすると、pと同時に、文字列領域も確保されます。
ただし、これは文字列の時のみです。以下はNGなので、ご注意ください。

float* p_pi = 3.1415;


pointerの初期化によって作成される文字列は書き込み禁止

処理系によっては、文字列をテキストセグメントに格納して、書き込み禁止属性を使って文字列を保護します。ですので、下記のCodeはNGです(XCode上では、コンパイルは通ってしまい、実行時に"Bus Error : 10"でstopしました)。

#include <stdio.h>
#include <stdlib.h>

int main() {
    char* p = "gooseberry";
    strncpy(p, "black", 5);     
    printf("%s\n", p);
    return 0;
}

一方、文字列によって初期化された「配列」は、書き換え可能です。 

#include <stdio.h>
#include <stdlib.h>

int main() {
    char p[] = "gooseberry";
    strncpy(p, "black", 5);     
    printf("%s\n", p);
    return 0;
}

Editor's note

pointerと配列の扱いの違いを認識できていない人は多いです。pointerと配列は、異なる型です。一方、同等に扱える場合もあります。ここら辺の話は、 

エキスパートCプログラミング―知られざるCの深層
ピーター ヴァン・デ・リンデン (著)

に詳しく書かれていますので、興味ある方は、ご一読を。


もしよろしければ、サポートをお願いします! 頂いたサポートは、Creatorとしての活動費に充てさせて頂きます。