2011-03-30 44 views
1

遇到一些麻煩了解這兩個代碼段之間的差: 我分配動態範圍內我的代碼爲一個整數數組空間與以下語句時的動態存儲器分配和sizeof()

int *arr = calloc(cnt, sizeof(int)); 

在另一個函數中,我通過了arr,我想確定arr中的大小(元素數量)。 當我打電話

int arr_sz = sizeof(arr)/sizeof(int); 

它只返回1,這是一個字節的只是數目爲兩個參數的int我假定(4/4)= 1。 我只是認爲這將是一樣使用陣列

int arr[8]; 
    int arr_sz = sizeof(arr)/sizeof(int); 

返回數組中元素的實際數量。

如果有人可以清除這件事,那會很好。謝謝!

+0

數組是公正的指針,編譯器可以幫助您管理。一旦他們通過一個函數,或者如果動態分配,編譯器不能幫助你。 – slezica 2011-03-30 20:22:38

+0

@Santiago Lezica :: *數組只是指針,編譯器可以幫助您管理* - >這很奇怪。請通過 - http://www.lysator.liu.se/c/c-faq/c-2.html – Sadique 2011-03-30 20:27:52

+0

您在報價中減半了我的評論。另一半很重要。 char a [10]和char * a之間顯然有區別,當你鍵入一行或另一行時會發生不同的事情。 – slezica 2011-03-30 20:34:36

回答

8
int *arr; ----> Pointer 
int arr[8]; ----> Array 

首先是你得到了什麼那裏 - int *arr是一個指針,指向一些字節的內存位置,數組。

數組的類型和指針是不一樣的

在另一個我通過arr的函數中,我想確定arr中的大小(數字元素)。當我打電話

int arr_sz = sizeof(arr)/sizeof(int); 

它只返回1,這是個字節在一個int爲兩個參數我假定(4/4)= 1只的數量。我只是認爲這將是相同的使用數組

即使是假設陣列 - 這是因爲,當傳遞到功能陣列得到腐朽爲指針。您需要顯式傳遞函數中的數組大小作爲單獨的參數。

經歷這一:

Sizeof an array in the C programming language?

有一個static陣列和動態存儲器分配之間的差。

sizeof運算符不能在動態分配上工作。 AFAIK它最適合基於堆棧和預定義的類型。

+0

曾經是一個數組?自從我完成C並且我的記憶力不好以來,我已經有一段時間了,但是我不認爲arr被聲明和初始化的方式會使它成爲一個數組? – 2011-03-30 20:19:47

+0

這個。沒有辦法動態確定C中數組的大小 – 2011-03-30 20:20:07

1

麥克,

arr是一個指針,因此,在系統的至少上,具有相同數目的字節作爲int的。數組並不總是與指向數組類型的指針相同。

2

好吧,int *arr聲明瞭一個指針,一個保存其他變量地址的變量,它的大小是一個整數的大小,因爲它是一個指針,它只需要保留地址,而不是指針本身。
int arr[8]聲明一個數組,一個整數集合。 sizeof(arr)指的是整個集合的大小,所以8 * sizeof(int)。
通常你會聽到「數組和指針是相同的東西」。那是不是是真的!他們是不同的東西。

0

sizeof(arr)sizeof(int*)相同,即單個指針的大小。但是,您可以將arr_sz計算爲... cnt

0

*arrarr[8]不同,因爲它的大小在編譯時是未知的,sizeof是編譯器的函數。所以當你的arr*arr時,sizeof將以字節返回指針的大小(sizeof(int *)),而當你的arrarr[8]時,sizeof將返回以字節爲單位的8個整數數組的大小(which is sizeof(int) * 8)。

當你將一個指向數組的指針傳給一個函數時,你必須指定它的大小,因爲編譯器不能爲你做。另一種方法是用null元素結束數組,並執行while循環。

0

如果有int arr1[8] ARR1的類型(只要編譯器而言)是大小爲8

的陣列整數在該示例int * arr2 ARR2的類型是指針的整數。

sizeof(arr1)是int陣列
sizeof(arr2)的尺寸被一個int指針的大小(4個字節的32位系統中,8個字節的64位系統上)

因此,唯一的區別是類型,編譯器認爲該變量是。

0

不能使用的sizeof帶記憶指針:

int *arr = calloc(cnt, sizeof(int)); 

但它的確定與陣列使用它:

int arr[8];