int main()
{
char *p="abcd";
while(*p!='\0') ++*p++;
printf("%s",p);
return 0;
}
コードが実行されない理由を理解できません。問題はステートメント++*p++
にありますが、何が問題なのですか?
int main()
{
char *p="abcd";
while(*p!='\0') ++*p++;
printf("%s",p);
return 0;
}
コードが実行されない理由を理解できません。問題はステートメント++*p++
にありますが、何が問題なのですか?
P
は、文字列 ' 'を変更しようとしているときに*p="abcd";
定数文字列リテラルを指します。セグメンテーション違反が発生する可能性があります。++*p++
"abcd"
a
'b'
++*p
`++*p++` means `++*p` then `p++`
^
| this operation try to modify string constant
char *foo = "abcd";
char bar[] = "abcd";
と の違いを考えてみましょfoo
うbar
。foo
文字列リテラル用に予約されたメモリを指すように初期化されるポインタです。bar
文字列リテラルに初期化された独自のメモリを持つ配列です。その値は、初期化中に文字列リテラルからコピーされます。などを変更するbar[0]
のは適切ですが、 ではありませんfoo[0]
。したがって、配列宣言が必要です。
ただし、配列宣言をインクリメントすることはできません。これは、ポインター変数または整数変数の操作です。さらに、ループはp
印刷される前にポイントする場所を変更するため、文字列の元の場所をどこかに保持する必要があります。したがって、ポインタまたは整数宣言も必要です。
これを念頭に置いて、コードを次のように変更することをお勧めします。
int main()
{
char str[] = "abcd";
/* Using a pointer variable: */
for (char *ptr = str; *ptr != '\0'; ++*ptr++);
/* Using a size_t variable: */
for (size_t x = 0; str[x] != '\0'; str[x++]++);
printf("%s", str);
return 0;
}
//char *p="abcd";//"string" is const char, don't change.
char str[]="abcd";//is copied, including the '\0' to reserve space
char *p = str;
while(*p!='\0') ++*p++;
//printf("%s",p);//address pointing of 'p' has been changed
printf("%s",str);//display "bcde"