声明一个没有const的C风格的string是不好的? 如果是这样,为什么?

在C ++中执行此操作

char* cool = "cool"; 

编译好,但给我一个警告:

不赞成将string常量转换为char *。

我永远不会故意使用C风格的string而不是std::string ,但是万一我被问到这个问题:

声明一个没有const修饰符的C风格的string是不好的做法? 如果是这样,为什么?

是的,这个声明是不好的做法,因为它允许通过写入string字面意外地激发未定义行为的许多方法,包括:

 cool[0] = 'k'; strcpy(cool, "oops"); 

另一方面,这是非常好的,因为它分配一个非const的字符数组:

 char cool[] = "cool"; 

是的,在C ++中,您应该始终使用types为const char *const char [N]variables引用string文字。 编写新的C代码时,这也是最好的做法。

string文字存储在只读存储器中,这是可能的; 他们的types是适当的const限定。 C,但不包括C ++,包括一个向后兼容的疣, 即使它们存储在只读存储器中,编译器也会给它们typeschar [N] 。 这是因为string文字比const限定符更老。 const是在现在所谓的“C89”的前期发明的 – 早期的“K&R”forms的语言没有它。

一些C编译器包括禁用向后兼容疣的可选模式,而char *foo = "..."; 会得到与C ++相同或类似的诊断。 GCC拼写这个模式-Wwrite-strings 。 我强烈推荐它用于新的代码; 然而,打开旧代码很容易需要大量的scutwork几乎没有什么好处。

首先, char* cool = "cool"; 不是标准的C ++。 一个string文字的types是const char[n] 。 所以上面这行代码打破了const正确性,不应该编译。 一些编译器如GCC允许这样做,但由于它是从C中暂停的,所以会发出警告。由于MSVC是错误,所以会发出错误。

其次,为什么不让编译器为你工作? 如果它被标记为const那么如果你不小心尝试修改它,你会得到一个很好的编译器错误。 如果你不这样做,那么你可以得到一个非常难以发现的运行时间错误。

这不好。 这很糟糕。 在C ++ 11中,这是不可能的。

修改string文字的内存是未定义的行为。

这是不好的,因为string常量每个二进制文件只能包含一次(关键字:stringtable, .strtab )。 例如在

 char *cool = "cool"; char *nothot = "cool"; 

两个variables都可以指向相同的内存位置。 修改其中一个的内容可能会改变另一个,所以之后

 strcpy(nothot, "warm"); 

你的cool变得“温暖”。

总之,这是不确定的行为。

它是一个string文字,因此它应该是不变的,因为内存可能位于只读部分。 如果你有char cool[] = "cool"; 那么这不是问题,记忆是你的。

char * cool =“cool”

“cool”将被存储在function共享的只读块(通常在数据段中)。 如果你试图通过冷点来修改string“cool”,程序运行时会出现错误,例如段错误。 如果你使用const char* cool = "cool" ,如果你试图修改string,编译时会出错。
你可以阅读这个页面了解更多信息http://www.geeksforgeeks.org/storage-for-strings-in-c/

Interesting Posts