我有几个问题想问关于字符串字面值和C-字符串。
如果我有以下代码:
char cstr[] = "c-string";
据我了解,字符串字面量在内存中创建时带有一个终止空字节。例如,从地址0xA0开始到0xA9结束,在这之后,该地址被返回和/或强制转换为char[]类型,然后指向该地址。
然后,可以合法地执行以下操作:
for (int i = 0; i < (sizeof(array)/sizeof(char)); ++i)
cstr[i] = 97+i;
因此,在这个意义上,只要将字符串字面量转换为char []类型,它们就可以被修改吗?
但是对于常规指针,我了解到当它们指向内存中的字符串字面量时,它们无法修改内容,因为大多数编译器会将分配的内存标记为“只读”,并放在某些较低的地址空间中用于常量。
char * p = "const cstring";
*p = 'A'; // illegal memory write
我想了解的是为什么char *类型不能像数组一样指向字符串常量并修改它们的常数值? 为什么字符串常量不能转换为char *而可以转换成char []? 如果我对这里的想法有误或完全错了,请随时纠正我。
char * p = "const cstring";
应该会抛出编译错误,因为"const cstring"
是类型为const char*
的常量(特别指您不应该像在示例中使用它一样使用它)。 - tylerlconst char*
的变量。 - Lightness Races in Orbitconst char[N]
,这与const char*
几乎等效。你可以争辩一些迂腐的细节,但那只会增加混淆而不是清晰度。@LightnessRacesinOrbit - tylerl