数组的大小...它是如何工作的?

时间:2017-03-22 22:59:11

标签: c sizeof

在这里观看:

int main(void){
 int array[10];
 printf("%d",sizeof(array));
}

在这种情况下,它显示40,但sizeof如何工作?
'阵列'只是一个地址,它如何仅用一个地址来确定大小?

---编辑---
我严重解释了自己......我知道数组不是地址,但此程序中使用的单词array等同于地址

5 个答案:

答案 0 :(得分:4)

  

'阵列'只是一个地址

不是。你相信一些关于数组的错误信息。

数组不是地址。可以在需要数组元素地址的上下文中使用数组

我可以在需要柠檬皮的配方中使用橙皮;这并不意味着橘子是柠檬。

  

如何仅使用地址来确定大小?

没有。

array是一个由十个四字节整数组成的数组。编译器知道这一点。您的计划相当于printf("%zu",10 * sizeof int);

(迂腐:sizeof给出char s中的大小。恰好在绝大多数情况下,char是一个字节。)

在C99中说:

是合法的
int n = whatever();
int b[n + 10];
printf("%zu\n", sizeof b);

确定这会打印出(n + 10) * sizeof int

它到底是怎么做到的?

击败了我。找到C99编译器的源代码,看看它的作用。但首先想一想:如果你必须编写一个具有该属性的编译器,你会做什么?

最后,流行测验:这个程序做了什么?

int main(void){
 int array[10];
 int *pi = array;
 printf("%zu\n", sizeof array);
 printf("%zu\n", sizeof pi);
}

答案 1 :(得分:1)

sizeof以字符形式给出数组的大小(在大多数系统上长度为1个字节)。

每个int在你的系统上有4个字符长,所以要获得数组元素数量的大小,试试:

sizeof(array) / sizeof(int)

请记住,这仅适用于静态分配的数组。对于动态分配的数组(即使用malloc),您必须在其他地方保持数组的长度安全,否则在数组末尾有一些魔术值,可以让您迭代地找到数组的大小。数组(通过循环直到你达到魔术值)。一个普通的神奇价值"是NULL。

Sizeof使用提供给它的符号typename(或提供给它的类型)来确定大小。 int varname[10]需要sizeof(int)* 10个字符。如果您要使用

int *varname = (int*)malloc(sizeof(int) * 10));

然后,sizeof(varname)会给你与sizeof(int *)相同的结果,这在大多数情况下是4或8,具体取决于你是在32位还是64位系统上。 / p>

请注意,对数组使用初始值设定项时:

int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};

然后sizeof(array)将返回与运行时相同的值:

int array[10];

这是因为C在编译时会知道数组的大小,并且在两种情况下都将数组的类型推断为10个整数的数组。

答案 2 :(得分:1)

数组是一种独特的类型。 它们转换为指向算术表达式和函数调用中第一个元素的指针,但是sizeof表达式都不是。

sizeof运算符sizeof array(没有parens)也可以)并且该运算符可以访问变量的实际类型,即{{1 (大小为int[10])。

顺便说一句,sizeof(int) * 10的值类型为sizeof,因此您需要使用size_t打印,而不是%zu

答案 3 :(得分:0)

当编译器生成可执行文件时,它会确定大小并将其直接放入要运行的代码中。请注意,不同平台上的sizeof(int)可能不同。)

运行时可执行代码的结果如下:

#define SIZEOF_INT (4)
#define SIZEOF_ARRAY (4*SIZEOF_INT)
int main(void){
 int array[10];
 printf("%d",SIZEOF_ARRAY /*compiler replaces sizeof(array) here */);
}

'阵列'仍然是运行时的地址(在可执行文件中)。但sizeof(数组)会更改为与运行时大小相等的数字。

答案 4 :(得分:0)

请检查此链接,其中包含您正在寻找的解释,这有助于您解决问题。 Mark Harrison的

How do I determine the size of my array in C?

To determine the number of elements in the array, we can divide the total size of the array by the size of the array element. You could do this with the type, like this:

int a[17];
int n = sizeof(a) / sizeof(int);
and get the proper answer (68 / 4 = 17), but if the type of a changed you would have a nasty bug if you forgot to change the sizeof(int) as well.

So the preferred divisor is sizeof(a[0]), the size of the zeroeth element of the array.

int a[17];
int n = sizeof(a) / sizeof(a[0]);