2017-09-24 244 views
2

我搜索來計算我的數組的大小。 像往常一樣,我將數組的大小除以單元格的大小。 當我嘗試使用數組的時候它是可以工作的,但是如果我在數組中使用指針,我會發現一個非常奇怪的值。指針訪問數組的大小

請問您能否賜教?

在這裏,我的代碼:只在陣列

int tab1K_I[1000]; 
int * tab1k_p = tab1K_I; 

int c,v; 
c = sizeof (tab1k_p)/sizeof(*tab1k_p); 
printf("c : %d\r\n", c); 

v = sizeof (tab1K_I)/sizeof(tab1K_I[0]); 
printf("v :%d\r\n", v); 

c = 2; 
v = 1000; 

回答

2
#define ARRAY_LENGTH(array) (sizeof(array)/sizeof(*array)) 

作品。在你的代碼中,int * tab1k_p而不是array,這是一個指針,因此你的方法不起作用。

sizeof(tab1K_I)sizeof(int[1000])它是sizeof(int) * 1000,因此ARRAY_LENGTH(tab1K_I)等於sizeof(int)

然而,sizeof(tab1k_p)sizeof(int *),這是不一樣的sizeof(int[1000]),因此ARRAY_LENGTH(tab1k_p)產生sizeof(int *)/sizeof(int),其不產生預期的結果。

+0

謝謝@MarkWeston – Aldarme

0

數組和指針都分配在堆棧上。但是當數組被分配時,其大小在編譯時被預定義。另一方面,指針只分配空間來存儲地址。

這裏,tab1k_p指針在堆棧上佔用8個字節(sizeof(* int)在64位系統上爲8)。 tab1K_I從棧中取1000 * 4(即:1000 * sizeof(int))。

* tab1k_p是數組中的第一個元素,因爲該賦值。數組的第一個元素是int。的sizeof(int)的是4。因此,

sizeof (tab1k_p)/sizeof(*tab1k_p);是8/4 = 2

sizeof (tab1K_I)/sizeof(tab1K_I[0])是4分之4000= 1000