【问题标题】:Trouble Creating Dynamic Integer Array创建动态整数数组时遇到问题
【发布时间】:2013-02-08 08:43:59
【问题描述】:

我确定它很小,但我一直收到一个初始化错误,说明我在初始化之前如何继续尝试使用它。

#include <iostream>
using namespace std;
int main()
{
    int* ordered;

    ordered[0] = 5;
    cout << ordered[0];
    return 0;
}

额外问题,我可以使用*ordered 访问起始地址并使用*ordered++ 遍历数组吗?

【问题讨论】:

  • 您尚未在任何地方创建动态整数数组。您所创建的只是指向int 的指针。

标签: c++ arrays dynamic integer dynamic-arrays


【解决方案1】:
int* ordered;
ordered[0] = 5;

ordered 是一个未初始化的指针。它指向任何随机地址。取消引用此类指针会导致未定义的行为,并且很可能会使您的程序崩溃。
为了能够用这个指针做一些有意义的事情,它需要指向一些有效的内存区域。你可以这样做:

int *ordered = new[x];

现在,ordered 指向一个足以容纳x 整数的内存区域。但是,你必须记住在使用后释放内存:

delete []ordered;       

在 C++ 中,使用 std::vector 而不是动态分配的数组要好得多,因为您不必像使用 new [] 那样进行手动内存管理。简单地说,std::vector 很难出错。

【讨论】:

  • @Howdy_McGee:他们没有。只有指向有效对象的指针才能取消引用。除非你得到的只是未定义的行为。而 UB 意味着程序可以显示任何行为但不能保证该行为,因此您的程序有时可能会工作,但不能保证总是这样做。
  • 我不确定我是否理解您的意思,但我知道如果我使用char* asdf = "asdf",我可以使用索引asdf[0]= a 访问每个字母。
  • @Howdy_McGee:这仍然是未定义的行为。您有一个指针 asdf 指向字符串文字,字符串文字“asdf”被放置在只读内存中,您无法修改此字符串文字的内容。但请注意,在这种情况下,指针确实指向了一个有效的(只读)内存位置。好读:What is the difference between char a[] = “string”; and char *p = “string”;
【解决方案2】:

问题是没有与ordered 关联的内存。你有一些选择:

  • 使用new[]ordered 分配一些内存
  • 改用std::vector&lt;int&gt;

如果您使用vector,您可以在开始时分配内存或使用它的push_back 方法,这将导致它根据需要增长。

【讨论】:

  • 不能声明字符数组等其他数据类型的数组吗?
  • @Howdy_McGee 你可以,但vector 是首选,除非你有明确且合理的理由不使用它。
  • 不能使用向量 - 因为我正在学习的课程不允许它:/
  • @Howdy_McGee 他们是否也不允许 std::string 支持字符数组?
猜你喜欢
  • 1970-01-01
  • 2023-03-05
  • 2020-05-06
  • 2014-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多