在函数中创建值,然后在全局指针数组中保存值上的指针 我对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)来解决这个问题代码>
(通常是代码> *.CPP)包含
<> P>一旦函数被整齐地分割成声明和定义,就到了执行典型C++源文件管理的下一步:把声明放入头文件(通常是代码> *.H/COD>或<代码> *.HPP<代码>)和<代码> >从实现文件中包含。然后为这两个函数定义再添加两个实现文件。在那里添加相应的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)来解决这个问题代码>
(通常是代码> *.CPP)包含
<> P>一旦函数被整齐地分割成声明和定义,就到了执行典型C++源文件管理的下一步:把声明放入头文件(通常是代码> *.H/COD>或<代码> *.HPP<代码>)和<代码> >从实现文件中包含。然后为这两个函数定义再添加两个实现文件。在那里添加相应的main
#也包括
s。不要忘记在标题中包含卫士
最后,分别编译这三个实现文件,并使用链接器从三个生成的目标文件创建一个可执行文件。即使您修复了要编译的代码,您仍在存储指向立即超出范围的临时变量的指针…请避免全局/类变量持有传递给函数的临时状态。我认为这是代码混淆。实际上,最终程序应该实例化一个vi对象(见Ni-Vis)。指向该对象的指针应保存为全局,以防止在函数离开后删除该对象。该对象将保留在内存中。我想这是禁止的。如果我将全局数组从指针更改为VI对象,程序将分配一个VI对象300倍的内存(仅用于一种VI对象)。即使我只使用了一个条目。但我希望程序在创建VI对象时只分配内存。即使您修复了要编译的代码,您仍然存储了指向临时对象的指针,该临时对象立即超出范围…请避免全局/类变量持有传递给函数的临时状态。我认为这是代码混淆。实际上,最终程序应该实例化一个vi对象(见Ni-Vis)。指向该对象的指针应保存为全局,以防止在函数离开后删除该对象。该对象将保留在内存中。我想这是禁止的。如果我将全局数组从指针更改为VI对象,程序将分配一个VI对象300倍的内存(仅用于一种VI对象)。即使我只使用了一个条目。但是我希望程序只在创建VI对象时分配内存。非常感谢。在Java中,我不需要这个。我仍然不知道确切的原因,但是如果编译器需要