為什么我在下面的代碼中有記憶體錯誤?我如何解決它?
我想閱讀外部功能的進度。但我只得到輸出get_report_progress:100
#include <iostream>
int* int_get_progress = 0;
void get_progress(int* int_get_progress)
{
int n = 100;
int *report_progress = &n;
int_get_progress = report_progress;
std::cout << "get_report_progress:" << *int_get_progress <<std::endl;
}
int main()
{
get_progress(int_get_progress);
std::cout << "main get process:" << *int_get_progress << std::endl;
return 0;
}
uj5u.com熱心網友回復:
您的全域int_get_progress變數是一個初始化為 null 的指標。您將其按值傳遞給函式,因此制作了它的副本。因此,函式分配給該指標的任何新值都是副本,而不是原始值。因此,全域int_get_progress變數保持不變,并main()最終延遲一個空指標,這是未定義的行為,在這種情況下會導致記憶體錯誤。
即使您修復代碼以讓函式更新呼叫者的指標,您的代碼仍然無法正常作業,因為您將指標設定為指向函式退出時超出范圍的區域變數,因此您會離開指標懸空,指向無效記憶體,當該指標被取消參考時,這也是未定義的行為。
您的全域變數(不需要是全域變數)根本不應該是指標,但它可以通過指標傳遞,例如:
#include <iostream>
void get_progress(int* p_progress)
{
int n = 100;
*p_progress = n;
std::cout << "get_report_progress:" << *p_progress << std::endl;
}
int main()
{
int progress = 0;
get_progress(&progress);
std::cout << "main get process:" << progress << std::endl;
return 0;
}
或者,通過參考傳遞它,例如:
#include <iostream>
void get_progress(int& ref_progress)
{
int n = 100;
ref_progress = n;
std::cout << "get_report_progress:" << ref_progress << std::endl;
}
int main()
{
int progress = 0;
get_progress(progress);
std::cout << "main get process:" << progress << std::endl;
return 0;
}
或者,根本不要通過引數傳遞它,而是回傳它,例如:
#include <iostream>
int get_progress()
{
int n = 100;
std::cout << "get_report_progress:" << n << std::endl;
return n;
}
int main()
{
int progress = get_progress();
std::cout << "main get process:" << progress << std::endl;
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/530780.html
標籤:C 记忆
