sizeof
只有在将数组应用于原始数组时,才能找到数组的长度。
int a[5]; //real array. NOT a pointersizeof(a); // :)
但是,当数组衰变为指针时,大小将给出指针的大小,而不是数组的大小。
int a[5];int * p = a;sizeof(p); // :(
正如您已经很清楚地指出的那样,main作为参数接收数组的长度(ARGC)。是的,这是出于必要,不是多余的。..(嗯,它有点红,因为argv被一个空指针很方便地结束了,但是我偏离了)。
对于为什么会发生这种情况,有一些理由。我们怎样才能使一个C数组也知道它的长度呢?
第一个想法是不要让数组在传递给函数时衰减到指针中,并且在类型系统中继续保持数组长度。这样做的不好之处在于,您需要为每个可能的数组长度设置一个单独的函数,这样做并不是一个好主意。(帕斯卡做了这件事,有些人认为这是它“输给”C的原因之一)
第二个想法是将数组长度存储在数组旁边,就像现代编程语言所做的那样:
a -> [5];[0,0,0,0,0]
但是你只是在创造一个无形的struct
幕后和C哲学不赞成这种开销。尽管如此,自己创建这样一个结构通常是解决某些问题的一个好主意:
struct {
size_t length;
int * elements;}
您可以考虑的另一件事是,C中的字符串是如何终止的,而不是存储长度(就像Pascal中的那样)。要存储长度而不必担心限制,需要一个扑通四个字节,这是一个难以想象的代价(至少在当时)。人们可能想知道数组是否也可以像那样以空结尾,但是如何允许数组存储空值呢?