在函数中创建值,然后在全局指针数组中保存值上的指针 我对C++比较陌生,并用java(我更喜欢它)。 我这里有些指针问题。我创建了一个最小程序来模拟更复杂程序的行为

在函数中创建值,然后在全局指针数组中保存值上的指针 我对C++比较陌生,并用java(我更喜欢它)。 我这里有些指针问题。我创建了一个最小程序来模拟更复杂程序的行为,c++,arrays,pointers,C++,Arrays,Pointers,代码如下: void test (int); void test2(int*); int* global [5]; //Array of int-pointer int main(int argc, char** argv) { int z = 3; int y = 5; cin >> z; // get some number global[0] = &y; // global 0 points on y

代码如下:

void test (int);
void test2(int*);

int* global [5];    //Array of int-pointer

int main(int argc, char** argv) {
    int z = 3;
    int y = 5;      
    cin >> z;       // get some number
    global[0] = &y; // global 0 points on y

    test(z);        // the corpus delicti

    //just printing stuff
    cout << global[0]<<endl;   //target address in pointer
    cout << &global[0]<<endl;  //address of pointer
    cout << *global[0]<<endl;  //target of pointer

    return 0; //whatever
}


//function doing random stuff and calling test2
void test (int b){
    int i = b*b;
    test2(&i);
    return;
}

//test2 called by test puts the address of int i (defined in test) into global[0]
void test2(int* j){
   global[0]= j; 
}
我在这里找不到任何范围问题。我试着把test的int I改成一个全局变量,但是没有用,所以我想,这不是原因

编辑:它现在编译,但为cin=20给出了错误的值*全局[0]应为400,但为2130567168。这似乎不是一个int/uint问题。它离2,14e9太远了。
Edit2:输入值无关紧要。

'test2'未在此范围内声明
这是因为编译器不知道什么是
test2
。您需要在main之上添加一个函数原型

void test (int b);
void test2(int& j);
或者只是:

void test (int);
void test2(int&);
因为此时编译器只需要知道参数的类型,而不需要知道它们的名称


编辑:将函数定义移到main上方而不添加原型也可以,但最好使用原型。

test2
。您需要在main之上添加一个函数原型

void test (int b);
void test2(int& j);
或者只是:

void test (int);
void test2(int&);
因为此时编译器只需要知道参数的类型,而不需要知道它们的名称


编辑:将函数定义移到main之上而不添加原型也可以,但是最好使用原型。

在调用test2之前需要声明它。每个函数在调用之前都需要声明

在main上方添加这些行以声明函数

void test2(int& j);
void test2(int& j);

int main(){...}

您需要在调用test2之前声明它。每个函数在调用之前都需要声明

在main上方添加这些行以声明函数

void test2(int& j);
void test2(int& j);

int main(){...}

在调用函数之前,编译器必须了解它

因此,您可以重新安排函数定义,使
test2
排在第一位,
test
排在第二位,
main
排在最后,或者将
test2
test1
的声明放在
main
之前:

void test2(int& j); // declaration
void test(int b);   // declaration

int main(int argc, char** argv) {
    // ...
}

void test(int b){ // definition
    // ...
}

void test2(int& j) { // definition
    // ...
}
这将揭示一个更严重的错误;您正在使用
int*
调用
test2
,但它需要
int&
。您可以通过将调用转换为
test2(i)来解决这个问题


<> P>一旦函数被整齐地分割成声明和定义,就到了执行典型C++源文件管理的下一步:把声明放入头文件(通常是代码> *.H/COD>或<代码> *.HPP<代码>)和<代码> >从实现文件中包含
(通常是代码> *.CPP)包含
main
。然后为这两个函数定义再添加两个实现文件。在那里添加相应的
#也包括
s。不要忘记在标题中包含卫士


最后,分别编译这三个实现文件,并使用链接器从三个生成的目标文件创建一个可执行文件。

在调用函数之前,编译器必须了解它

因此,您可以重新安排函数定义,使
test2
排在第一位,
test
排在第二位,
main
排在最后,或者将
test2
test1
的声明放在
main
之前:

void test2(int& j); // declaration
void test(int b);   // declaration

int main(int argc, char** argv) {
    // ...
}

void test(int b){ // definition
    // ...
}

void test2(int& j) { // definition
    // ...
}
这将揭示一个更严重的错误;您正在使用
int*
调用
test2
,但它需要
int&
。您可以通过将调用转换为
test2(i)来解决这个问题


<> P>一旦函数被整齐地分割成声明和定义,就到了执行典型C++源文件管理的下一步:把声明放入头文件(通常是代码> *.H/COD>或<代码> *.HPP<代码>)和<代码> >从实现文件中包含
(通常是代码> *.CPP)包含
main
。然后为这两个函数定义再添加两个实现文件。在那里添加相应的
#也包括
s。不要忘记在标题中包含卫士


最后,分别编译这三个实现文件,并使用链接器从三个生成的目标文件创建一个可执行文件。

即使您修复了要编译的代码,您仍在存储指向立即超出范围的临时变量的指针…请避免全局/类变量持有传递给函数的临时状态。我认为这是代码混淆。实际上,最终程序应该实例化一个vi对象(见Ni-Vis)。指向该对象的指针应保存为全局,以防止在函数离开后删除该对象。该对象将保留在内存中。我想这是禁止的。如果我将全局数组从指针更改为VI对象,程序将分配一个VI对象300倍的内存(仅用于一种VI对象)。即使我只使用了一个条目。但我希望程序在创建VI对象时只分配内存。即使您修复了要编译的代码,您仍然存储了指向临时对象的指针,该临时对象立即超出范围…请避免全局/类变量持有传递给函数的临时状态。我认为这是代码混淆。实际上,最终程序应该实例化一个vi对象(见Ni-Vis)。指向该对象的指针应保存为全局,以防止在函数离开后删除该对象。该对象将保留在内存中。我想这是禁止的。如果我将全局数组从指针更改为VI对象,程序将分配一个VI对象300倍的内存(仅用于一种VI对象)。即使我只使用了一个条目。但是我希望程序只在创建VI对象时分配内存。非常感谢。在Java中,我不需要这个。我仍然不知道确切的原因,但是如果编译器需要