【问题标题】:C++ array initializationC++ 数组初始化
【发布时间】:2009-06-25 07:21:56
【问题描述】:

为什么我不能用字符串初始化本地数组

【问题讨论】:

  • 给我们代码,它可能会使问题更清楚。
  • 你的意思是问:“为什么我不能一个字符串初始化一个本地数组?”

标签: c++ arrays initialization


【解决方案1】:

为什么我不能用字符串初始化本地数组

正确的答案是你可以——对于给定的数组和字符串定义。你到底想达到什么目标?

char str[] = "Hello world";

【讨论】:

  • 最好是“const char str[]”。否则你最终可能会写入可执行字节。
  • @xtofl: 不。在上面的代码中,常量字符串文字被复制到一个可写的内存位置。代码是安全的,str 可以安全地被操纵。如果我使用指针而不是数组,你会是对的。
【解决方案2】:

这个问题在细节上非常简单,但是:

char arr[] = {'a','b','c', 0};

char arr[] = "string";

编辑

回答问题:

char s1[] = "hi";
char s2[] = {'h','i',0};
memcpy(s1, "by", sizeof(s1));
memcpy(s2, "by", sizeof(s2));
cout << ios::hex << &s1 << endl;
cout << ios::hex << &s2 << endl;
cout << s1 << endl;
cout << s2 << endl;

打印:

80xbfffed72
80xbfffed6f
by
by

至少在我的系统上看起来两者都分配在相同的内存空间中,我没有看到任何问题或差异。例如,C 将 string 定义为空终止字符数组 - 我相信这在 C++ 中是相同的,不要与 std::string 混淆。

【讨论】:

  • 这些是不等价的:后一种形式允许您例如memset(arr, 0, 7),从而更改可执行文件的数据段。
  • @xtofl:你能详细介绍一下吗?我很确定这两者是等价的。如果第二个是“const char * arr=”会有所不同,但事实并非如此,而且我很确定带引号的字符串只是聚合初始化程序的特殊语法,因此行为应该是相同的。
【解决方案3】:
std::vector<std::string> abc(5,"abc");

将创建一个包含 5 个初始化为“abc”的元素的向量。

【讨论】:

    猜你喜欢
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 2018-01-15
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多