C ++为什么要初始化一个空字符串数组?

时间:2013-09-17 20:20:20

标签: c++ arrays string

这是一个“它是如何运作”的问题。根据我的理解,你必须初始化一个具有恒定数量元素的非动态数组(int intarr [5]),否则你的数组将写入可能为其他东西分配的内存块。

那么为什么你可以在没有任何元素的情况下初始化一个字符串数组(字符串strArray [])?

示例:

#include <iostream>
#include <string>
using namespace std;

int main()
{
string s[] = {"hi", "there"};

cout << s[0] << s[1];
cin >> s[10]; //why is this ok?
cout << s[10];

return 0;
}

2 个答案:

答案 0 :(得分:5)

作为一项功能,如果为其指定初始化程序,C ++(和C)允许您声明一个数组而不指定元素数。编译器将推断出所需元素的数量。

所以

   int intarr[] = { 1,2,3,4,5};

编译器会看到数组需要有5个整数的空间,这与你说的完全相同:

int intarr[5] = {1,2,3,4,5};

字符串数组是一样的;

 string s[] = {"hi", "there"};

就像你写的那样

 string s[2] = {"hi", "there"};

你的代码有一个严重的错误;

string s[] = {"hi", "there"};

cout << s[0] << s[1];
cin >> s[10]; //why is this ok?

cin >> s[10];绝对不行。数组s只有2个元素,即使编译器没有生成错误,也不能使用s[10] 这样做会导致undefined behavior - 因此它可能会起作用,或者可能会崩溃,或者它可以执行任何操作。

答案 1 :(得分:0)

您可以通过2种方式使用string strArray[]

string strArray[] = {"apple","banana"};

void function(string strArray[]) {
    ...
}

在第一种情况下,数组的大小由初始化器的数量自动确定(2)。在第二种情况下,不需要数组的大小,因为它是一个正式的参数。

除此之外,您必须声明数组的大小。如果它基于stringint,则无关紧要。

如果您在示例中写入s[10]但只有2个元素,则表示您正在写入未分配的内存,并且程序行为未定义。它可能不会崩溃,但稍后会发生坏事。