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としての活動費に充てさせて頂きます。