【发布时间】:2022-01-03 23:26:17
【问题描述】:
如果我通过以下方式初始化多个字符串(字符数组)变量:
const char* myString1 = "string content 1";
const char* myString2 = "string content 2";
由于const char* 只是一个特定char 对象的指针,它不包含它所指向的字符数组的任何大小或范围信息。
那么,两个字符串文字是否有可能相互重叠? (新分配的和旧的重叠)
重叠是指以下行为;
// Continue from the code block above
std::cout << myString1 << std::endl;
std::cout << myString2 << std::endl;
输出
string costring content 2
string content 2
所以myString2 的开头位于myString1 的中间。因为const char* 没有“保护”(“拥有”)一系列内存位置,而只是它指向的那个,所以我看不到 C++ 如何防止其他字符串文字“登陆”旧的内存位置.
C++/编译器如何避免此类问题?
如果我把const char*改成const char[],还是一样吗?
【问题讨论】:
-
为什么编译器会犯这样一个基本错误?它完全知道字符串的长度并进行相应的分配。由于附加了一个空字节,长度信息不需要存储在可执行文件中。
-
@YvesDaoust 但是如果是
int*或任何其他末尾没有明确空字节的数组怎么办。 -
一个更好的例子可能是
const char* x = "string content 1"; const char* y = "content 1";。而且,是的,这两者可以重叠。而且,不,这不是问题。 -
问题是关于
const char*和字符串文字。其他数组没有字符串文字的类似物。这取决于您如何初始化它们。int a[5];将为5元素提供空间。int* a = new int[10]将为10元素提供空间,并具有动态存储持续时间。int a[] = {1, 2, 3, 4, 5}还将为5元素提供空间。 -
标题有点不对劲。我们知道指针本身不能重叠,它们指向的内容可以(因为它们可以指向同一字符串中的不同位置),但问题的重点是“字符串文字可以重叠吗?”我认为更改标题以使其适合是有道理的。