为什么需要声明数组大小,例如:键入“array [50]”,而类型“array []”仍然会做同样的事情。我在一些代码中看到了其他类似的东西
答案 0 :(得分:5)
在函数参数中,int array[]
和int array[40]
完全是完全相同的(它们都由编译器转换为int *
);但是,我已经看到第二种形式被用作输出数组的一种文档形式,向客户端代码显示至少预期数组的大小。
就个人而言,我对这种用法有点矛盾,因为 对文档很有用,但是新手常常认为(1)这个要求以某种方式由编译器强制执行,(2) sizeof(array)
按预期工作。
首先,只有在您使用某些内容对其进行初始化时,才能执行int array[]
。在
int array[] = { 1, 2, 3, 4, 5};
编译器通过计算初始化程序中的元素并使数组足够大来帮助您;但你不能这样做:
int array[]; /* does not compile */
因为编译器不知道要分配多大的数组。
现在,人们有时会这样做:
int array[50] = {1, 2, 3};
这很有用,因为您有第一个值的默认值,另一个初始化为零。这通常用字符串完成:
char buf[256] = "test";
您已buf
初始化"test"
,但您仍有其余字符的余量,如果您使用此字符,则通常会使用此字符。想要将其他字符串连接到它或在不同的代码路径中使用缓冲区的完整大小。
char username[256] = "guest";
if(requireLogin) {
printf("Please enter your name: ");
if(!fgets(username, sizeof username, stdin)) exit(1);
size_t sz = strlen(username);
sz && username[sz-1]=='\n' && username[sz-1]=0;
}
logCurrentUser(username);
答案 1 :(得分:3)
如果编译器无法根据传递的初始化数量(如果有的话)计算出来,则需要显式提供数组大小。
例如,loadClass
与308 protected synchronized Class<?> More ...loadClass(String name, boolean resolve)
309 throws ClassNotFoundException
310 {
311 // First, check if the class has already been loaded
312 Class c = findLoadedClass(name);
313 if (c == null) {
314 try {
315 if (parent != null) {
316 c = parent.loadClass(name, false);
相同,更可取。如果您希望阵列中的元素多于初始化者,则应指定大小。
如果您没有指定任何初始化工具,那么您必须提供尺寸。