通过指针访问数组的大小

时间:2017-09-24 11:03:37

标签: c arrays pointers size

我搜索计算数组的大小。 为此,像往常一样,我将数组的大小除以单元格的大小。 当我尝试使用数组时它可以正常工作,但如果我在数组上使用指针,我会发现一个非常奇怪的值。

拜托,你能告诉我吗?

在这里,我的代码:

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 个答案:

答案 0 :(得分:2)

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

仅适用于数组。在您的代码中,int * tab1k_p 数组,它是指针,因此您的方法不会工作

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),但不会产生预期的结果

答案 1 :(得分:0)

数组和指针都在堆栈上分配。但是在分配数组时,它的大小是在编译时预定义的。另一方面,指针只分配空间来存储地址。

这里,tab1k_p指针在堆栈上占用8个字节(sizeof(* int)在64位系统上为8)。 tab1K_I从您的堆栈中获取1000 * 4(即:1000 * sizeof(int))。

由于赋值,* tab1k_p是数组的第一个元素。数组的第一个元素是int。 sizeof(int)是4.因此,

sizeof (tab1K_I) / sizeof(tab1K_I[0])是8/4 = 2.

curl -o- -L https://yarnpkg.com/install.sh | bash 是4000/4 = 1000。