[英]C++ function to return a pointer to a multidimensional array
我正在嘗試在 c++ 文件中創建一個 function 來創建單位矩陣,並返回指向該矩陣中第一個元素的指針
我有以下代碼,使用void print_matrix
function 來顯示矩陣
#include <iostream>
void print_matrix(int *p, int n) {
for (int row = 0; row < n; row++) {
for (int col = 0; col < n; col++) {
std::cout << *p << "\t";
p++;
}
std::cout << std::endl;
}
std::cout << std::endl;
}
int *get_identity_matrix(int n) {
int m[n][n];
for (int row = 0; row < n; row++) {
for (int col = 0; col < n; col++) {
if (row == col) {
m[row][col] = 1;
} else {
m[row][col] = 0;
}
}
}
std::cout << "Before:" << std::endl;
std::cout << "Address of m[0][0]: " << &m[0][0] << std::endl;
print_matrix(&m[0][0], n);
return &m[0][0];
}
int main() {
int n = 3;
int *pm = get_identity_matrix(n);
std::cout << "After:" << std::endl;
std::cout << "Address of pm: " << pm << std::endl;
print_matrix(pm, n);
return 0;
}
編譯時我收到警告:(不確定這是否有用)
src/main.cpp:27:13: warning: address of stack memory associated with local variable 'm' returned [-Wreturn-stack-address]
return &m[0][0];
^
1 warning generated.
運行代碼時,我得到以下 output:
Before:
Address of m[0][0]: 0x7ff7b42ff9b0
1 0 0
0 1 0
0 0 1
After:
Address of pm: 0x7ff7b42ff9b0
0 32760 1
1 197148432 1
197144129 32760 -1271924224
TL;DR 為什么這些矩陣在打印時不同? 每次調用print_matrix
function 時,我都會為int *p, int n
傳遞相同的值
我期待print_matrix
function 打印相同的單位矩陣兩次
在 C++ 中, scope 中的局部變量go 。 當他們這樣做時,他們占用的 memory 將被釋放。 m
是get_identity_matrix
中的局部變量; 因此,在返回m
的 memory 地址后,一旦 function 結束,占用的 memory m
就會從 scope 中釋放出來。 因此,你現在有一個指向一堆垃圾的指針 memory,當你打印它的值時,你會得到一堆垃圾值。
返回本地數組的 memory 地址通常是未定義的行為。 相反,使用 C++ 等效的std::array
,而不是 C 風格的 arrays。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.