这是一个“它是如何运作”的问题。根据我的理解,你必须初始化一个具有恒定数量元素的非动态数组(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;
}
答案 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)。在第二种情况下,不需要数组的大小,因为它是一个正式的参数。
除此之外,您必须声明数组的大小。如果它基于string
或int
,则无关紧要。
如果您在示例中写入s[10]
但只有2个元素,则表示您正在写入未分配的内存,并且程序行为未定义。它可能不会崩溃,但稍后会发生坏事。