你被 C++ 中一个非常古老的向后兼容性问题绊倒了,它继承自 C,并且可以追溯到 C++ 存在的时代。was没有这样的事情const
。字符串文字有类型const char [n]
,但是,除非您告诉编译器您不需要与 1990 年之前的代码兼容,否则它会默默地允许您设置char *
变量来指向它们。但它won't允许您通过这样的指针进行写入。实际内存(只要可能)被标记为只读;您观察到的“分段错误”错误是操作系统报告尝试写入只读内存的方式。
就语言规范而言,写入const
数据通过非const
指针——无论你如何设置——都有“未定义的行为”,这是一种奇特的说法,“程序不正确,但编译器不必发出诊断,如果你得到一个已编译的可执行文件,它会可能做anything“分段错误”几乎总是意味着您的程序在某个地方有未定义的行为。
如果我使用适当的设置编译您的程序,我确实会收到错误:
$ 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";
^~~~~~~~~~~~~
直到您获得足够的技能来知道何时不同的设置更合适,编译all你的 C++ 程序-std=gnu++11 -Wall -Werror
,或者任何你的编译器的等价物。 (您似乎使用的是 Unix 风格的操作系统,因此这些设置应该有效。您可能还想要-g
and/or -O
.)
您的程序可以通过将其更改为 read 来运行
#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
to char name[]
;我还改变了其他一些东西,但只是为了展示更好的风格。其作用是强制编译器将字符串文字复制到writable进入时的记忆main
. Why确实如此,在这里解释起来需要很长时间;查阅一本好的 C++ 教科书。