違いはありますか:
char string = "name";
const char* point = string;
対
const char string[] = "name";
違いも教えてください。
違いはありますか:
char string = "name";
const char* point = string;
対
const char string[] = "name";
違いも教えてください。
はい。
1 つ目はメモリの読み取り専用セクションを指すだけで、実際には次のように宣言する必要があります。
const char* string = "name";
2 つ目は、文字列を保持するのに十分な長さの配列を作成し"name"
(つまり、4 文字と null ターミネータの 1 文字)、割り当てられたスペース内に文字列をコピーします。
#include <stdio.h>
int main(int argc, const char** argv)
{
const char *a1 = "hello";
const char a2[] = "hello";
char* b1;
char* b2;
b2 = (char*) a2;
*b2 = 'c';
puts(b2);
b1 = (char*)a1;
*b1 = 'c';
puts(b1);
return 0;
}
b2 は 'cello' を正しく表示します。b1 はセグメンテーション違反を引き起こします。
これは、b1 がコードのテキスト セグメントに格納されているのに対し、b2 はデータ セグメントに格納されているためです。
私はそれを台無しにしなかったことを願っています...
また、コンパイラは、何かがテキストセグメントで宣言されているがコードでアクセスされていることを認識することにより、これを無効にする魔法を行うことができるため、Cは時々キャッチして、宣言をデータセグメントに変更します