我遇到了问题。在内部函数“pop”中,int rezultat具有正确的值,但在外面,是0.我不知道C ++,但我必须在学校这样做,它花了我2个小时,我不知道我做错了什么...请帮忙。
#include <iostream>
int rezultat;
struct stosik {
int x;
stosik *next;
};
void push(stosik* &stos, int x) {
stosik* tymczasowy = new stosik;
tymczasowy->x = x;
tymczasowy->next = stos;
stos=tymczasowy;
delete tymczasowy;
}
bool isEmpty(stosik* stos){
return stos != NULL;
}
//HERE@@@@@@@@@@@@@@@@@@@@@@@
bool pop(stosik* &stos, int rezultat){
if (!isEmpty(stos)) {
return false;
}
stosik* tymczasowy = stos;
rezultat = tymczasowy -> x;
if(stos->next !=NULL){
tymczasowy = stos -> next;
stos=tymczasowy;
}
else {
std::cout << "Nic" << std::endl;
}
// delete tymczasowy;
std::cout <<"Rezultat na koncu dziala funkcji "<<rezultat << std::endl;
return true;
}
bool topEl(stosik* &stos, int* result, int mekeke){
if (isEmpty(stos))
{
return false;
}
*result = stos ->x;
mekeke=*result;
return true;
}
int main(){
stosik* stos_roboczy=NULL; // deklaracja stosu, domyślnie NULL
std::cout << "0 empty, 1 something "<< std::endl;
std::cout << isEmpty(stos_roboczy) << std::endl;
std::cout << "" << std::endl;
push(stos_roboczy, 5);
push(stos_roboczy, 15);
push(stos_roboczy, 25);
std::cout << "0 empty, 1 something<<std::endl;
std::cout << isEmpty(stos_roboczy) << std::endl;
std::cout << "" << std::endl;
//AND HERE @@@@@@@@@@@@@@@@@@@@@@@
pop(stos_roboczy, rezultat);
std::cout <<"Wrong result after function: "<<rezultat << std::endl;
//
// pop(stos_roboczy, rezultat);
// pop(stos_roboczy, rezultat);
//
// std::cout << rezultat << std::endl;
}
答案 0 :(得分:4)
您有两个不同的整数,它们碰巧具有相同的名称:在文件顶部声明的全局<do something here>
,以及函数{{1的参数列表中的函数参数rezultat
}}。
您将全局rezultat
的值传递给pop()
,然后为函数内的函数参数rezultat
分配一个新值。函数退出时,函数参数pop()
消失。您没有为全局rezultat
分配新值,因此它具有与之前相同的值。
如果要将函数内部的变量值发送到外部,请使用rezultat
语句。
如果您将全局重命名为其他内容,则应该清除两者之间的混淆。
另请参阅@ForeverStudent's excellent answer。他发现了一些您需要查看的其他问题。
答案 1 :(得分:2)
您的代码存在很多问题。
首先,您的push
函数具有签名void push(stosik* &stos, int x)
根据您的语义,您最希望void push(stosik* stos, int x)
pop
也在push
的正文内:
stosik* tymczasowy = new stosik; //allocate on heap, OK
tymczasowy->x = x; //OK
tymczasowy->next = stos;//OK
stos=tymczasowy; //BOTH pointers now point to the same memory
delete tymczasowy;//you are freeing memory for both.
//stos->next is now inaccessible and leaked
最后一行创建了内存泄漏,两个指针都指向同一个位置,并释放内存。确定你仍然有指针,但它不再指向有效的对象实例。
此外,您正在使用将初始化为0的外部全局变量rezultat
。
现在,您的pop
函数具有相同名称的形式参数。
这导致rezultat
引用函数作用域中的变量而不是全局变量。
我建议你避免使用全局变量,但是如果必须使用它们,至少不要在块作用域中覆盖它们。
bool pop(stosik* stos, int rezultat) //valid code, but terrible practice
{
//here rezultat refers to the variable passed in NOT the global
//global variable is still accessible in this scope via ::rezultat
if (!isEmpty(stos))
{
return false;
}
stosik* tymczasowy = stos;
rezultat = tymczasowy -> x;
//this rezultat will be destroyed when this function returns.
...
}
如果你决定顽皮并使用全局变量,那么你需要这样做:
bool pop(stosik* stos)
{
if (!isEmpty(stos))
{
return false;
}
stosik* tymczasowy = stos;
rezultat = tymczasowy -> x;
//now this refers to the global variable
...
}
答案 2 :(得分:1)
如果要通过参数返回值,则需要使用引用,例如
bool pop(stosik* &stos, int &rezultat){
注意&
之前的rezultat
。
当您调用pop(stos_roboczy, rezultat);
时,这将在堆栈上引用rezultat
而不是其值。它允许函数将给定值返回给调用者的变量,而不是仅修改局部变量/参数。
有关详细信息,另请参阅Passing arguments by reference。