C++ 定义字符串文字

C++ 定义字符串文字,c++,arrays,pointers,C++,Arrays,Pointers,这两个文本字符串定义之间有什么区别 const char *message1 = "message1"; const char message2[] = "message2"; 如果两个都以null结尾,那就太奇怪了——当我将第一个传递给某个文本打印函数时,我得到了一个“内存无法写入”错误,但当传递第二个时,一切正常 问题的功能是来自Fallout 2游戏mod源(名为sfall)的第三方函数。据我所知,该函数调用本机Fallout 2引擎定义的函数,

这两个文本字符串定义之间有什么区别

const char *message1 = "message1";
const char message2[] = "message2";
如果两个都以null结尾,那就太奇怪了——当我将第一个传递给某个文本打印函数时,我得到了一个“内存无法写入”错误,但当传递第二个时,一切正常


问题的功能是来自Fallout 2游戏mod源(名为sfall)的第三方函数。据我所知,该函数调用本机Fallout 2引擎定义的函数,sfall代码通过自己的包装器调用该函数。

在第一种情况下,字符串文字衰减为指针

在第二种情况下,字符串文本被存储到一个char数组中,编译器将自动调整该数组的大小,以适应使用空终止符完成的文本

第二个变量将在变量中保留更多信息。 例如,您可以在第二次调用
std::size
,但不能在第一次调用


调用接受
const char*
的打印函数应该与这两种情况相同。因为在第二种情况下,
常量char[]
将在函数调用时衰减为指针。

在第一种情况下,字符串文字衰减为指针

const char message2[] = "message2";
在第二种情况下,字符串文本被存储到一个char数组中,编译器将自动调整该数组的大小,以适应使用空终止符完成的文本

第二个变量将在变量中保留更多信息。 例如,您可以在第二次调用
std::size
,但不能在第一次调用

调用接受
const char*
的打印函数应该与这两种情况相同。因为在第二种情况下,
constchar[]
将在函数调用时衰减为指针

const char message2[] = "message2";
“message2”
将被置于只读存储器中。然后将其字符复制到
message2[]
数组的分配内存中

const char *message1 = "message1";
“message1”
将被置于只读存储器中<代码>消息1只是指向该内存的指针

在这两个示例中,值都是常量

“message2”
将被置于只读存储器中。然后将其字符复制到
message2[]
数组的分配内存中

const char *message1 = "message1";
“message1”
将被置于只读存储器中<代码>消息1只是指向该内存的指针

在这两个示例中,值都是常量

这两个文本字符串定义之间有什么区别


message1
是指向字符串文字的指针

message2
是字符串文本的数组副本

考虑一个假设的打印功能

void hostile_print( const char* msg )
{
    const_cast<char*>(msg)[0] = 0;
}
在下面的代码中,数组的地址可能位于操作系统标记为可写的内存中。也许是那堆。这对于本地阵列来说并不少见

无论如何,
恶意打印
提交未定义的行为,程序按预期进行。因为未定义的行为可能是这样的

const char *message1 = "message1";
hostile_print(message1);
const char message2[] = "message2";
hostile_print(message2);
在这两种情况下,函数都会写入不应该写入的内存

这两个文本字符串定义之间有什么区别


message1
是指向字符串文字的指针

message2
是字符串文本的数组副本

考虑一个假设的
打印功能

void hostile_print( const char* msg )
{
    const_cast<char*>(msg)[0] = 0;
}
在下面的代码中,数组的地址可能位于操作系统标记为可写的内存中。也许是那堆。这对于本地阵列来说并不少见

无论如何,
恶意打印
提交未定义的行为,程序按预期进行。因为未定义的行为可能是这样的

const char *message1 = "message1";
hostile_print(message1);
const char message2[] = "message2";
hostile_print(message2);

在这两种情况下,函数都在向内存写入它不应该写入的内容。

message1
是一个指针,
message2
是一个数组。请注意,问题中的字符串文字是
“message1”
“message2”
。名为
message1
message2
的变量不是字符串文字。“内存无法写入”我闻到试图修改字符串的“打印功能”很差,忽略了它是
const
@HolyBlackCat这一事实,我正要说同样的话。为什么打印函数试图写入字符串的内存?它应该只从字符串中读取您所指的“某些文本打印功能”是什么?您的问题似乎是关于此函数的行为
message1
是一个指针,而
message2
是一个数组。请注意,问题中的字符串文字是
“message1”
“message2”
。名为
message1
message2
的变量不是字符串文字。“内存无法写入”我闻到试图修改字符串的“打印功能”很差,忽略了它是
const
@HolyBlackCat这一事实,我正要说同样的话。为什么打印函数试图写入字符串的内存?它应该只从字符串中读取您所指的“某些文本打印功能”是什么?您的问题似乎是关于我在调试器的某个断点处研究的这个函数的行为。这两个变量分配在完全不同的地址。这可能是错误的原因吗?您不能在只读内存中写入,因为它在程序的整个生命周期中都有效。第一个变量指向只读内存,这就是产生错误的原因。但是第二个配置了可写的自动存储。字符串文本被复制到该变量中。正如我在调试器的某个断点中所研究的,这两个变量被分配到完全不同的地址。这可能是错误的原因吗?您不能在只读内存中写入,因为它在程序的整个生命周期中都有效。第一个变量指向只读备忘录