数组初始化

时间:2015-10-05 13:04:28

标签: c++ visual-c++

我有两种类型的数组初始化将用于字符串构造函数

$(function () {
    $("input:enabled").filter(function () {
        if ($(this).attr("type") == "checkbox" || $(this).attr("type") == "radio")
            return $(this).val().trim() == "" || !this.checked;
        else
            return this.value.trim() == "";
    }).first().focus();
});

为什么在int main() { //char foo [] = { 'a', 'd' }; char foo[] = "ad"; std::string s = foo; cout<<s; int i; cin >> i; } 情况下我有输出:

char foo [] = { 'a', 'd' };

当数组初始化为ad╠╠╠╠╠╠R8$1↑■╬ 时,我的输出正常 - char foo [] = "ad"; - 在第一种情况下是预期的。

这两个数组初始化的区别是什么?为什么我在第一个数组中输出垃圾?

4 个答案:

答案 0 :(得分:3)

您需要将字符串空终止

char foo [] = { 'a', 'd', '\0' };

字符串文字已经空终止。

  

§2.14.5字符串文字

     

8普通字符串文字和UTF-8字符串文字也称为窄字符串文字。 窄字符串文字的类型为“数组n const char,其中n是下面定义的字符串大小,并且具有静态存储持续时间

     

14在任何必要的连接之后,在翻译阶段7中, '\0'被附加到每个字符串文字,以便扫描字符串的程序可以找到它的结尾

答案 1 :(得分:1)

char foo [] = { 'a', 'd' };的情况下,您声明了一个包含两个元素的字符数组,即不是以空字符结尾的字符串。因此,当您尝试将其作为字符串打印时,<<运算符将继续读取发生的任何字符,直到找到空字节为止。这是未定义的行为。

char foo [] = "ad";的情况下,您正在使用字符串常量初始化字符数组。该常量有3个字符,即“a”,“d”和空字节,因此数组长度为3个字符。因此,当您打印时,它会正确打印。

答案 2 :(得分:1)

char foo[] = "ad";

实际上会创建一个<{1}}数组

char

char foo[] = { 'a', 'd', '\0' }; 很重要,因为它用于表示char数组的结尾。创建字符串'\0'时,会读取s的内容,直到达到foo为止。输出'\0'后,您会获得s。当你这样做

ad

没有char foo [] = { 'a', 'd' }; 因此,当您创建字符串'\0'时,构造函数将继续运行,直到达到s。这是未定义的行为,因为我们正在使用我们尚未分配的内存。

答案 3 :(得分:0)

写作时

std::string = foo; // copy ctor --  for std::string will be called

期望以null终止(C样式)字符串。但是在以下情况下,您没有空字符来终止C样式字符串。

char foo [] = { 'a', 'd' }; // Incorrect
char foo[] =  { 'a', 'd' ,'\0'}; //Correct

以下情况很好,因为编译器会为您生成一个空终止C字符串。

char foo[] = "ad";

还有一点需要注意,“ad”是一个字符串文字,{'a','d','\ 0'}是一个数组初始值设定项。以下是值得注意的

char[] foo = "ad";
foo[1] = 'M'; // Undefined behavior 

char[] foo = { 'a', 'd' ,'\0'};
foo[1] = 'M'; // Is OK