簡體   English   中英

C ++函數返回數組

[英]C++ functions returning arrays

我是C ++的新手。 我習慣用Java編程。 這個特殊的問題給我帶來了很大的問題,因為C ++在處理數組時並不像Java那樣。 在C ++中,數組只是指針。

但為什么這個代碼:

#include <iostream>
#define SIZE 3
using namespace std;

void printArray(int*, int);
int * getArray();
int ctr = 0;

int main() {
  int * array = getArray();

  cout << endl << "Verifying 2" << endl;
  for (ctr = 0; ctr < SIZE; ctr++)
    cout << array[ctr] << endl;

  printArray(array, SIZE);
  return 0;
}

int * getArray() {
  int a[] = {1, 2, 3};
  cout << endl << "Verifying 1" << endl;
  for (ctr = 0; ctr < SIZE; ctr++)
    cout << a[ctr] << endl;
  return a;
}

void printArray(int array[], int sizer) {
  cout << endl << "Verifying 3" << endl;
  int ctr = 0;
  for (ctr = 0; ctr < sizer; ctr++) {
    cout << array[ctr] << endl;
  }
}

打印出驗證2的任意值並驗證3.也許這與數組作為指針實際處理的方式有關。

問題是你不能返回本地數組:

int a[] = {1, 2, 3};
...
return a;

是無效的。 你需要復制a返回之前到動態內存。 目前,由於a自動存儲中分配,因此只要函數返回,就會回收數組的內存,從而使返回的值無效。 Java沒有相同的問題,因為所有對象(包括數組)都在動態存儲中分配。

更好的是,您應該避免使用數組來支持旨在替換它們的C ++類。 在這種情況下,使用std::vector<int>將是更好的選擇。

因為您的數組是堆棧分配的。 從Java遷移到C ++,您必須非常小心對象的生命周期。 在Java中,所有內容都是堆分配的,並且在沒有對其進行引用時進行垃圾回收。

但是,在這里,您定義了一個堆棧分配的數組a,當您退出函數getArray時會將其銷毀。 這是(很多)原因之一,矢量比普通數組更受歡迎 - 它們為您處理分配和釋放。

#include <vector>

std::vector<int> getArray() 
{
    std::vector<int> a = {1, 2, 3};
    return a;
}

內存中有兩個變量可以去的地方:堆棧和堆。 堆棧包含在方法中創建的局部變量。 堆在其他條件下保存其他變量,如靜態變量。

GetArray()中創建a存儲在堆棧上的局部變量,而a是指向該位置的指針。 當方法返回指針時,釋放了該堆棧的層(包括指針指向的實際值)。

相反,你需要動態分配數組,然后這些值將在不被清除函數返回時和堆a會指向他們那里。

int * GetArray() {
  int* a = new int[3];
  a[0] = 1;
  a[1] = 2;
  a[2] = 3;
  cout << endl << "Verifying 1" << endl;
  for (int ctr = 0; ctr < 3; ctr++)
    cout << a[ctr] << endl;
  return a;
}

現在你將這些int的地址傳遞給函數和從函數傳遞,而值都位於堆中,直到程序結束才會釋放它們,或者(最好) delete它們。

暫無
暫無

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

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