在閱讀realtime_tools::RealtimeBuffer 的源代碼時,我有很多關于指標和參考的問題。相關代碼如下所示:
void writeFromNonRT(const T& data)
{
// get lock
lock();
// copy data into non-realtime buffer
*non_realtime_data_ = data;
new_data_available_ = true;
// release lock
mutex_.unlock();
}
為了弄清楚,我嘗試撰寫類似的代碼,例如:
#include <iostream>
using namespace std;
void pt_ref(int& data)
{
int *ptr;
ptr = &data; // ptr points to "data"
cout << "data's addres: "<< ptr <<"\n"; // print address
}
int main()
{
int x = 3;
pt_ref(x);
cout << "x's address: " << &x;
}
\\ output:
\\ data's addres: 0x7ffe05c17c4c
\\ x's address: 0x7ffe05c17c4c
該代碼運行良好,但與源代碼仍然不同。
// these 2 lines are different.
*non_realtime_data_ = data;
ptr = &data;
所以我嘗試更改ptr = &data;為*ptr = data;,然后再次運行代碼,出現錯誤(“非法指令”)。
希望有人能回答我,非常感謝。
PS:我在replit在線編譯器上運行了代碼。
uj5u.com熱心網友回復:
我試圖改變 ptr = &data; 到 *ptr = data;,然后再次運行代碼,出現錯誤(“非法指令”)。
問題是指標未初始化ptr(并且不指向任何物件),因此取消參考該指標(您在左側撰寫時所做的)會導致未定義的行為。int*ptr
int *ptr; //pointer ptr does not point to any int object as of now
*ptr = data;
//-^^^^--------->undefined behavior since ptr doesn't point to any int object
要解決這個問題,請確保在取消參考之前ptr,指標ptr指向某個int物件。
void pt_ref(int& data)
{
int var = 10; //int object
//-------------vvvv-------->now ptr points to "var"
int *ptr = &var;
//--vvvv------------------->this is fine now
*ptr = data;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/467517.html
上一篇:手動使超過3000個檔案的CloudFront快取失效
下一篇:C 中1[指標]的含義?[復制]
