簡體   English   中英

C++ function 返回指向多維數組的指針

[英]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 將被釋放。 mget_identity_matrix中的局部變量; 因此,在返回m的 memory 地址后,一旦 function 結束,占用的 memory m就會從 scope 中釋放出來。 因此,你現在有一個指向一堆垃圾的指針 memory,當你打印它的值時,你會得到一堆垃圾值。

返回本地數組的 memory 地址通常是未定義的行為。 相反,使用 C++ 等效的std::array ,而不是 C 風格的 arrays。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM