静态字符*与静态字符[]内存访问 我把C代码编译成C++,遇到了一些让我困惑的事情。考虑下面的函数从LuaFielSeals.< /P> static const char *perm2string (unsigned short mode) { static char perms[10] = "---------"; //static char* perms = "---------"; int i; for (i=0;i<9;i++) perms[i]='-'; if (mode & _S_IREAD) { perms[0] = 'r'; perms[3] = 'r'; perms[6] = 'r'; } if (mode & _S_IWRITE) { perms[1] = 'w'; perms[4] = 'w'; perms[7] = 'w'; } if (mode & _S_IEXEC) { perms[2] = 'x'; perms[5] = 'x'; perms[8] = 'x'; } return perms; } static const char*perm2string(无符号短模式){ 静态字符perms[10]=“-----------”; //静态字符*perms=“-----------”; int i; 对于(i=0;i

静态字符*与静态字符[]内存访问 我把C代码编译成C++,遇到了一些让我困惑的事情。考虑下面的函数从LuaFielSeals.< /P> static const char *perm2string (unsigned short mode) { static char perms[10] = "---------"; //static char* perms = "---------"; int i; for (i=0;i<9;i++) perms[i]='-'; if (mode & _S_IREAD) { perms[0] = 'r'; perms[3] = 'r'; perms[6] = 'r'; } if (mode & _S_IWRITE) { perms[1] = 'w'; perms[4] = 'w'; perms[7] = 'w'; } if (mode & _S_IEXEC) { perms[2] = 'x'; perms[5] = 'x'; perms[8] = 'x'; } return perms; } static const char*perm2string(无符号短模式){ 静态字符perms[10]=“-----------”; //静态字符*perms=“-----------”; int i; 对于(i=0;i,c++,C++,字符串文本存储在内存的只读部分。任何修改字符串文本内容的尝试都会在大多数实现中调用未定义的行为和分段错误。 因此,如果您需要一个可修改的字符数组,那么将其声明为char perms[10],而不是char*perms字符串文本存储在内存的只读部分。任何修改字符串文本内容的尝试都会在大多数实现中调用未定义的行为和分段错误。 因此,如果您需要一个可修改的字符数组,那么将其声明为char perms[10],而不是char*perms,这是正确的 字符串文字是不可变的,“-----------”是字符

字符串文本存储在内存的只读部分。任何修改字符串文本内容的尝试都会在大多数实现中调用未定义的行为和分段错误。
因此,如果您需要一个可修改的字符数组,那么将其声明为
char perms[10]
,而不是
char*perms

字符串文本存储在内存的只读部分。任何修改字符串文本内容的尝试都会在大多数实现中调用未定义的行为和分段错误。 因此,如果您需要一个可修改的字符数组,那么将其声明为
char perms[10]
,而不是
char*perms

,这是正确的

字符串文字是不可变的,
“-----------”
是字符串文字。您的
静态字符*
指向该字符串文字

不可变性在编译时不是固有的,因此当您尝试写入文本时,您会得到未定义的行为。这可能会导致运行时崩溃

[C++11:2.14.5/12]:
是否所有字符串文字都是不同的(即存储在非重叠对象中)是实现定义的。尝试修改字符串文字的效果是未定义的。

C++实际上要求这个指针是一个
静态字符常量*
,尽管有些编译器只对此发出警告

但是,使用字符串文本初始化数组将复制字符串。数组是您自己的,可以随意使用。这就是为什么您可以修改
静态字符[10]
,而不会崩溃

[C++11:8.5.2/1]:
字符数组(无论是普通的
字符
有符号字符
,还是
无符号字符
),
char16\u t
array、
char32\u t
array或
wchar\u t
array可分别由窄字符文本、
char16\u t
string literal、
char32\u t
字符串文本或宽字符串文本初始化,或由大括号中包含的适当类型字符串文本初始化。连续字符f字符串文本的值初始化数组的元素。

字符串文字是不可变的,
“-----------”
是字符串文字。您的
静态字符*
指向该字符串文字

不可变性在编译时不是固有的,因此当您尝试写入文本时,您会得到未定义的行为。这可能会导致运行时崩溃

[C++11:2.14.5/12]:
是否所有字符串文字都是不同的(即存储在非重叠对象中)是实现定义的。尝试修改字符串文字的效果是未定义的。

C++实际上要求这个指针是一个
静态字符常量*
,尽管有些编译器只对此发出警告

但是,使用字符串文本初始化数组将复制字符串。数组是您自己的,可以随意使用。这就是为什么您可以修改
静态字符[10]
,而不会崩溃

[C++11:8.5.2/1]:
字符数组(无论是普通的
字符
有符号字符
,还是
无符号字符
),
char16\u t
array、
char32\u t
array或
wchar\u t
array可分别由窄字符文本、
char16\u t
string literal、
char32\u t
字符串文本或宽字符串文本初始化,或由大括号中包含的适当类型字符串文本初始化。连续字符f字符串文本的值初始化数组的元素。


当您编写以下内容时:

const char *X = "...."
您在只读内存中有
“…”
,并且
X
指向它。事实上,
X
的类型应该是
const char*
,而不仅仅是
char*

另一方面,当你写作时:

char X[] = "...."
这相当于:

char X[] = {'.', '.', '.', '.', '\0'}

这是一个数组初始值设定项。换句话说,
X
将是一个数组(不是指针),它将包含
“…”
的内容。因为它不是
常量,所以您可以毫无问题地更改它。

当您编写以下内容时:

const char *X = "...."
您在只读内存中有
“…”
,并且
X
指向它。事实上,
X
的类型应该是
const char*
,而不仅仅是
char*

另一方面,当你写作时:

char X[] = "...."
这相当于:

char X[] = {'.', '.', '.', '.', '\0'}

这是一个数组初始化器。换句话说,<代码> x>代码>将是一个数组(不是指针),它包含“代码>……”的代码。……<代码>,因为它不是“代码> const <代码>,你可以毫无问题地修改它。

字符串文字是 const char */Cuth>。你不允许在C++或C.</P>中修改它。

由于遗留原因,它们可以转换为<代码> char */COD>,但是这并不使它们修改为合法。<> p>字符串文字是 const char */COD>。不允许在C++或C.</P>中修改它们。


由于遗留原因,它们可以转换为“代码> char */CODE >,但是这并不使它们合法化。

< P>这与C++无关(与C有相同的结果)。<代码>静态char * PrMS=“-------”;是const,因为 > -< ->代码>是二进制的一部分。(可以使用<代码> ObjDopp> /Copy>程序>

< P>这是正常的,与C++无关(你将与C结果相同)。<代码>静态char * PrMS=“-------”;是const,因为 > ---->代码>是YOY的一部分。