【问题标题】:C++ why can you initialize an empty string array?C++为什么可以初始化一个空字符串数组?
【发布时间】:2013-09-17 20:20:19
【问题描述】:

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

那为什么不用任何元素就可以初始化一个字符串数组(string 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;
}

【问题讨论】:

  • 我不确定我是否理解你的问题...string strArray[]; 也不正确
  • 请更新您的问题以显示包含说明您所询问内容的声明的小型独立程序。
  • 对不起,我可以更好地问这个问题。编辑。
  • 问题是,这绝对是不行
  • 哦,所以添加到数组中不行吗?我被告知是的。 (这就是为什么我很困惑为什么它不会引起问题)

标签: c++ arrays string


【解决方案1】:

作为一个特性,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 &gt;&gt; s[10]; 绝对不行。数组s只有2个元素,即使编译器没有报错,也不能使用s[10] 这样做会导致undefined behavior - 所以它可能看起来可以工作,或者它可能会崩溃,或者它可以做任何事情。

【讨论】:

  • 好的,谢谢,我只是被误导了。这真的很清楚。
  • 我还要提一下,您需要指定所有维度(在多维数组中),except 为第一个,编译器可以推断。
【解决方案2】:

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

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

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

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

除此之外,您必须为数组声明一个大小。不管是基于string还是int

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

【讨论】:

  • void function(string strArray[]); 完全等同于void function(string* strArray);。也就是说,它根本不是一个数组。
  • @MarkLakata 在参数列表中,它们确实完全一样。
  • @jrok and nos - 我得到了纠正并学到了一些东西。如果你有一个 multidimensional 数组,那么会有区别,但是对于一维,没有区别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-20
  • 1970-01-01
  • 2019-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多