您已经绊倒了 C++ 中一个非常古老的向后兼容缺陷,它继承自 C 并且可以追溯到 没有像 const 这样的东西的日子。字符串文字的类型为 const char [n],但是,除非您告诉编译器您不需要与 1990 年之前的代码兼容,否则它将默默地允许您设置 char * 变量以指向它们。但它不会允许您通过这样的指针进行写入。实际内存(尽可能)标记为只读;您观察到的“分段错误”错误是操作系统如何报告写入只读内存的尝试。
就语言规范而言,通过非const 指针写入const 数据——但是你设法设置它——具有“未定义的行为”,这是说“程序是不正确,但编译器不必发出诊断,如果你得到一个编译的可执行文件,它可能会做任何事情。” “分段错误”几乎总是意味着您的程序在某处有未定义的行为。
如果我用适当的设置编译你的程序,我会得到一个错误:
$ g++ -std=gnu++11 -Wall -Werror test.cc
test.cc: In function ‘int main(int, char**)’:
test.cc:7:19: error: ISO C++ forbids converting a string constant to ‘char*’
[-Werror=write-strings]
char* name = "SAMPLE TEXT";
^~~~~~~~~~~~~
在您获得足够的技能以了解何时不同的设置更合适之前,请使用-std=gnu++11 -Wall -Werror 或任何与您的编译器等效的东西来编译所有您的 C++ 程序。 (您似乎使用的是 Unix 风格的操作系统,因此这些设置应该可以工作。您可能还需要-g 和/或-O。)
你的程序可以通过改变它来工作
#include <iostream>
#include <cstring>
int
main()
{
char name[] = "SAMPLE TEXT";
std::memset(name, '*', 6);
std::cout << name << '\n';
return 0;
}
=>
$ g++ -std=c++11 -Wall -Werror test.cc
$ ./a.out
****** TEXT
修复该错误的更改是从char *name 到char name[];我也改变了其他一些东西,但只是为了展示更好的风格。这样做是强制编译器在进入main 时将字符串文字复制到可写 内存。 为什么在这里解释需要很长时间;参考一本好的 C++ 教科书。