如何确定C语言中数组的大小?
也就是说,数组可以容纳多少元素?
如何确定C语言中数组的大小?
也就是说,数组可以容纳多少元素?
当前回答
除了已经提供的答案,我想指出一个特殊的情况下使用
sizeof(a) / sizeof (a[0])
如果a是char、unsigned char或signed char的数组,则不需要使用sizeof两次,因为带有这些类型的一个操作数的sizeof表达式的结果总是1。
引用自C18,6.5.3.4/4:
当sizeof应用于具有char类型、unsigned char类型或signed char类型(或其限定版本)的操作数时,结果为1。
因此,如果a是char、unsigned char或signed char类型的数组,sizeof(a) / sizeof(a[0])将等效于NUMBER OF ARRAY ELEMENTS / 1。除1是多余的。
在这种情况下,你可以简单地缩写为do:
sizeof(a)
例如:
char a[10];
size_t length = sizeof(a);
如果你想要证明,这里有一个GodBolt的链接。
尽管如此,如果类型发生重大变化(尽管这种情况很少见),该部门仍会保持安全。
其他回答
大小的“技巧”是我所知道的最好的方法,在括号的使用上有一个小而重要的变化(对我来说,这是一个主要的烦恼)。
正如维基百科的条目所表明的那样,C语言的sizeof不是一个函数;它是一个算子。因此,除非实参是类型名,否则不需要在实参周围加上圆括号。这很容易记住,因为它使实参看起来像一个强制转换表达式,它也使用括号。
所以:如果你有以下情况:
int myArray[10];
你可以用这样的代码找到元素的数量:
size_t n = sizeof myArray / sizeof *myArray;
对我来说,这比用括号代替要容易得多。我还赞成在除法的右边部分使用星号,因为它比索引更简洁。
当然,这也都是编译时的,所以没有必要担心除法会影响程序的性能。所以尽可能使用这个形式。
当你有一个实际对象时,使用sizeof总是最好的,而不是在一个类型上,因为这样你就不需要担心犯错误并声明错误的类型。
例如,假设您有一个函数,它将一些数据输出为字节流,例如跨网络输出。让我们调用send()函数,并将一个指向要发送的对象的指针和该对象中的字节数作为参数。所以,原型变成:
void send(const void *object, size_t size);
然后你需要发送一个整数,所以你像这样编码:
int foo = 4711;
send(&foo, sizeof (int));
现在,通过在两个地方指定foo类型,您引入了一种搬起石头砸自己的脚的微妙方法。如果一个改变了,而另一个没有改变,代码就会崩溃。因此,总是这样做:
send(&foo, sizeof foo);
现在你被保护了。当然,你复制了变量的名称,但如果你改变了它,编译器很可能会检测到这种破坏。
值得注意的是,sizeof在处理已经衰减为指针的数组值时没有帮助:即使它指向数组的开始,对编译器来说,它与指向该数组中单个元素的指针相同。指针不会“记住”用于初始化它的数组的任何其他内容。
int a[10];
int* p = a;
assert(sizeof(a) / sizeof(a[0]) == 10);
assert(sizeof(p) == sizeof(int*));
assert(sizeof(*p) == sizeof(int));
sizeof函数返回数组在内存中使用的字节数。如果你想计算数组中的元素数量,你应该用数组的sizeof变量类型除以这个数字。让我们说int array[10];,如果变量类型integer在你的计算机是32位(或4字节),为了得到你的数组的大小,你应该做以下工作:
int array[10];
size_t sizeOfArray = sizeof(array)/sizeof(int);
一个更优雅的解决方案是
size_t size = sizeof(a) / sizeof(*a);
最简单的答案:
#include <stdio.h>
int main(void) {
int a[] = {2,3,4,5,4,5,6,78,9,91,435,4,5,76,7,34}; // For example only
int size;
size = sizeof(a)/sizeof(a[0]); // Method
printf("size = %d", size);
return 0;
}