void f()
{
char *c = "Hello World!"
}
这个字符串存储在哪里?它有什么属性?我只知道它是一个常量,还有什么其他的吗?我能从函数体内返回它吗?
void f()
{
char *c = "Hello World!"
}
这个字符串存储在哪里?它有什么属性?我只知道它是一个常量,还有什么其他的吗?我能从函数体内返回它吗?
它已经和你的二进制文件捆绑在一起了——所谓的捆绑是指硬编码,因此你可以返回它并在其他地方使用它。但是你无法更改它,我强烈建议你将其声明为:
const char * x = "hello world";
§2.14.15 字符串字面值,第7节
狭义字符串字面值的类型为“长度为n的const char数组”,其中n是下文中定义的字符串大小,并具有静态存储期。
通常情况下,它被存储在只读内存区域,并具有静态存储分配。
执行像c [0] ='k'
等操作会引发未定义行为。
我可以从函数体内返回它吗?
可以的!
它具有静态存储期,因此在程序的整个生命周期内存在。编译器/链接器放置初始化数据的确切位置会有所不同。从函数返回指向它的指针是可以的,但请确保返回一个char const *
-- 对字符串进行写操作会导致未定义的行为。
这是实现定义的。大多数情况下,它将与程序中的所有其他字符串存储在一个字符串表中。通常,您可以将其视为全局静态const变量,但它无法在函数外部访问。
字符串字面量存储在数据段并在编译时分配。这有助于将相同的字符串字面量分配给多个变量,而无需创建字符串的副本。
例如,char * str="hello";
str是char指针,具有字符'h'的地址,而"hello"存储在数据段中,不能更改。尝试更改它会生成分段错误。
在分配字符数组字符串字面量时,在堆栈上创建字符串的副本。
即 char str[]="hello";
"hello"被复制到堆栈(以空字符结尾),并且str指向堆栈中的字符'h'。
我已经有一段时间没有使用C++了,但我记得我(自学)在字符串(好吧,字符数组...)方面遇到了很多问题。
如果你要修改它们的值,请确保使用new和delete关键字... 大致如此...
char *strText = new char[10];
/* Do something
...
...
...
*/
delete [] strText;
马丁
new[]
与 delete[]
匹配,而不是 delete
。或者只需使用 std::string
。 - fredoverflowdelete
,但我不会依赖它。 - Ton van den Heuvel
char*
进行赋值。它已经从const字面数组到char*
的弃用转换中删除了此功能。 - Johannes Schaub - litb