[英]Assigning Pointers to pointers in C++
我遇到過這樣的情況,我必須在函數中對矩陣做一些數學運算(在編譯時,它的維數未知,因此我必須將其保存為指針),然后將其等同於作為參數傳遞給功能。
每次代碼都會引發分段錯誤。 我在這里有一個示例代碼:
#include <iostream>
using namespace std;
void assign(int **a)
{
int **A = new int* [3];
int i, j;
for(i = 0; i < 3; i++)
A[i] = new int[3];
for(i = 0; i < 3; i++)
for(j = 0; j < 3; j++)
A[i][j] = 100;
a = A; /* equating the pointers */
}
int main()
{
int **ptr;
assign(ptr); /* Passing my pointer into the function */
cout << ptr[0][0] << endl;
return 0;
}
代碼是C ++,對於我來說,使函數具有除void以外的其他返回類型不是一種選擇。 而且我不想按行/列專業將矩陣保存在普通指針上-我需要知道為什么這行不通。
仔細看看您的代碼:
void assign(int** a)
{
// ...
}
int main()
{
int** ptr;
assign(ptr);
}
你傳遞a
由值-調用后assign(ptr)
你不會修改ptr
自身函數體內的,而僅僅是一個副本ptr
。
取ptr
作為參考:
void assign(int**& a)
{
// ...
}
其他可能的解決方案:
添加另一個級別的間接。
void assign(int*** a) { // ... *a = A; } int main() { int** ptr; assign(&ptr); }
從assign
返回。
int** assign() { // ... return A; } int main() { int** ptr; ptr = assign(); }
考慮一下內存中代碼中實際發生的情況。 這是一個示例,現在需要一些虛構的內存地址:
in main(): in assign():
ptr at 0x0100, value: garbage_ptr
call
----->
a at 0x0200, value: garbage_ptr
[after some computation]
A at 0x0204, value: 0x0400
[after the line: a = A;]
a at 0x0200, value: 0x0400
ptr at 0x0100, value: garbage_ptr
您會看到如何將任何東西都寫到ptr
的地址0x0100上。 這是因為a
在assign()
獲取的值 ptr
; 它不知道 ptr
是 。 ptr
仍然指向它的作用域在main()
的開頭開始時所做的未更改的(垃圾)值。
現在,假設將代碼更改為:
...
void assign(int ***a)
{
...
*a = A;
}
int main()
{
int **ptr;
assign(&ptr);
....
上面的插圖現在變為:
in main(): in assign():
ptr at 0x0100, value: garbage_ptr
&ptr rvalue, value: 0x0100
call
----->
a at 0x0200, value: 0x0100
*a at 0x100, value: garbage_ptr
[after some computation]
A at 0x0204, value: 0x0400
[after the line: *a = A;]
a at 0x200, value: 0x0100
*a at 0x100, value: 0x0400
return
<-----
ptr at 0x100, value: 0x0400
這樣, 0x0100
的值確實得到更改,這就是您想要的。 (實際上,您應該在C ++中使用此類的引用,但是使用指針顯示錯誤更容易。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.