2013-03-30 38 views
1
#include<stdio.h> 
using namespace std; 
void fun(int** a){} 
int main() 
{ 
    int n; 
    scanf("%d",&n); 
    int a[n][n]; 
    fun(a); 
    return 0; 
} 

獲取在C++此錯誤工作,但它工作正常用C 但對於類型強制轉換爲(無效*)一個 ,然後轉換爲陣列=(INT **)工作a:C++訪問雙陣列誤差在C

test_.cpp:9:8: error: cannot convert 
    ‘int (*)[(((unsigned int)(((int)n) + -0x00000000000000001)) + 1)]’ 
to ‘int**’ for argument ‘1’ to ‘void fun(int**)’ 
tried to pass a[][size] but size is not known 
+0

那麼如何將n [n]傳遞給函數如果n取自用戶 – rsaisankalp

回答

1

您的代碼有幾個問題。一個是C,另一個是C++。

的C題
即使在C,您的多維數組int a[n][n]不轉換爲int**。破碎的(或鋸齒狀的)多維數組與連續的多維數組之間存在巨大差異。粗糙的陣列被聲明和分配作爲

  • int ** jagged_array
    交錯數組這種風格的聲明顯然可以作爲int**參數一些功能通過;沒有涉及轉換。使用這種類型的數組,程序員必須爲指向數組中每個行的指針數組分配(並最終釋放)存儲空間,並且還必須爲每個數組的行分配(並最終釋放)存儲空間。

  • int * jagged_array[size_spec]
    由於數組在C(和C++)中衰減爲指針的方式,因此在此樣式中聲明的鋸齒數組也可以作爲int**參數傳遞給某個函數。對於這種類型的數組,程序員必須爲每個數組的行分配(並最終釋放)存儲空間。

注意,在兩種形式中,有在存儲器的顯式地點爲int*指針指向該陣列的行的第零元素。多維數組並非如此。計算多維數組中一行的指針,而不是存儲。聲明爲int a[n][n]的多維數組不能衰減到int**。它反而衰變爲int*[n]。在C中,接收可變長度多維數組(例如int a[n][n])的函數應聲明爲<return_type> fund (int n, int vla[n][n])。 (數組參數也可以指定爲vla[][n];不需要外部維度。)


的C++問題
您正在使用可變長度數組。 C++不支持C99概念。這個概念在C語言中並不存在,原來是1998年的C++版本。 2003 C++標準是1998年C++標準的一個小修改,所以它沒有跳轉到C99。最近的C++標準C++ 11的作者明確拒絕支持那些C99可變長度數組。你不能在C++中使用可變長度的數組,至少不能移植。

3

雙數組不會轉換爲雙指針。

傳遞一個雙陣列到你的函數,像這樣:

void fun(int arr[][5]); 

現在,它會工作。

1

T[N][N]衰變時,它變成T*[N],當傳入數組時,沒有可行的轉換。

+0

我認爲有趣(void * p)int ** a =(int **)p在這種情況下工作正常 – rsaisankalp

1

將二維數組傳遞給函數時,必須指定第二維大小。否則,編譯器不能在不知道第二維的大小的情況下對二維數組元素進行尋址。 使用

f(a[][5]) 
+0

if a [n] [n]其中n是從用戶a中獲取的,因爲除了類型轉換爲(void *)之外,還不知道其大小,因爲它的大小是未知的。是否有任何方法可以傳遞大小由用戶 – rsaisankalp

+0

定義但是代碼如何在c中工作正常,你可以在c中進行機制 – rsaisankalp