C ++初始化全局数组

时间:2011-05-06 17:37:45

标签: c++ arrays

嘿大家好我是一名经验丰富的java程序员,我只是在学习C ++。

现在我有点初学者的问题。我有一个类型为int的数组变量x。

用户将在方法B中输入x的大小。我想在方法A中使用x。

void method A()
{
 using int x [] blah blah blah
}

void method B()
{
int n;
cin >>n;
int x [n]; // How can I use this int x in method A without getting error: storage size x is unknown.
// Or the error 'x' was not declared in this scope.
}

编辑:参数传递不是我正在寻找的解决方案。

DOUBLE EDIT:我确实知道矢量选项,但我的程序正按时填写。我正在创建一个算法,每毫秒计算一次。

BTW我发现了一种方法。

int x [] = {}

method B();
method A () { blah blah use x}
method B () {/*int*/ x [n]}

6 个答案:

答案 0 :(得分:6)

如果你真的想要一个数组而不是一个向量,并且你希望该数组在运行时动态调整大小,则需要在堆上创建它(将其存储在指针中),并在完成后释放它。

来自Java,您需要了解C ++中没有垃圾收集 - 您希望在析构函数中使用new清理对象中的delete(在堆上创建)。

class foo
{
    private:
    int *array;

    public:
    foo() { array = NULL; };
    ~foo()
    {
        if (array != NULL)
            delete [] array;
    }

    void createArray()
    {
        array = new int[5];
    }

};

更多信息:http://www.cplusplus.com/doc/tutorial/dynamic/

答案 1 :(得分:1)

使用矢量:

std::vector<int> x(n);

然后将其作为std::vector<int> const &类型的参数传递给方法A.

修改:或者让vector成为您班级的数据成员,并将其设置为:

size_t n;
std::cin >> n;
x.resize(n);

答案 2 :(得分:1)

在C ++中,您无法使用运行时值直接调整数组大小,只能使用常量。

你几乎肯定想要矢量:

std::vector<int> x(n);

答案 3 :(得分:1)

编辑:充实答案。

我不知道你是在尝试学习数组,还是试图解决一些实际问题。我会假设后者。

方法A访问任何变量的唯一方法是它是否在范围内。具体而言,x必须是:

  • 一个本地,包括一个参数(但你对参数传递说不)
  • 班级成员,或
  • 全球

以下是x是类成员的解决方案:

class C {
public:
  std::vector<int> x;
  void A() {
    std::cout << x[2] << "\n"; // using x[], for example.
  }
  void B() {
    int n;
    cin >> n;
    x = std::vector<int>(n); // or, as others have pointed out, x.resize(n)
  }
};

答案 4 :(得分:0)

这是您的示例的一个版本,适用于c ++。

#include <iostream>

int *my_array;

void methodA(a,b){
     my_array[a] = b;
}

int methodB(){
     int n;
     std::cin >> n;
     my_array = new int[n];
}

int main(){
     int x;
     x = methodB();
     methodA(x-1, 20);
     delete [] my_array;
     return 0;
}

答案 5 :(得分:0)

请注意,C ++中的数组比Java更基本(也更危险)。

在Java中,检查对数组的每次访问,以确保您使用的元素编号在数组中。

在C ++中,数组只是指向已分配的内存区域的指针,您可以使用任何您喜欢的数组索引(无论是否在数组的范围内)。如果您的数组索引超出了数组的范围,那么您将访问(并修改,如果您要分配给数组元素!)那时内存中发生的任何事情。这可能会导致异常(如果内存地址在您的进程可访问的区域之外),或者可能导致几乎任何事情发生(更改程序中的另一个变量,更改操作系统中的某些内容,格式化您的硬盘,无论如何)被称为“未定义的行为”)。

当你在C ++中声明一个本地,静态或全局数组时,编译器需要知道那个数组的大小,因此它可以分配内存(当它超出范围时为你释放它)。因此数组大小必须是常量。

但是,数组只是一个指针。因此,如果你想要一个在编译时你不知道的数组的数组,你可以使用“new”在堆上创建一个数组。但是,一旦完成内存,你就有责任释放内存(使用“删除”)。

如果可以的话,我同意上面的海报使用矢量,因为这样可以防止您访问您习惯使用的数组边界之外的东西。

但是如果你想要最快的代码,请使用分配的数组:

class C {
 int [] x;

 void method A(int size)
 {
   x = new int[size];   // Allocate the array
   for(int i = 0; i < size; i++)
      x[i] = i;         // Initialise the elements (otherwise they contain random data)
   B();
   delete [] x;         // Don't forget to delete it when you have finished
                        // Note strange syntax - deleting an array needs the []
 }

 void method B()
 {
   int n;
   cin >> n;
   cout << x[n];
   // Be warned, if the user inputs a number < 0 or >= size, 
   // you will get undefined behaviour!
  }
}