没有数组大小的数组初始化
Array initialisation without array size
有人可以解释一下这个数组在没有数组大小的情况下是如何工作的吗?
#include <stdio.h>
int main(void) {
int a[]={},i;
for(i=0;i<=3;i++)scanf("%d",&a[i]);
printf("\n\n");
for(i=0;i<=3;i++)printf("%d ",a[i]);
return 0;
}
在 C 中,没有像 Java 这样的语言那样在 运行 时检查数组长度。在此代码中,在内存中的某个位置创建了一个空数组。当使用 a[i]
访问数组时,将根据元素的大小(在本例中为 int
的大小)计算内存位置,并访问该内存位置,无论您是否真的希望它被访问与否。 C 让您可以自由地做现代语言不允许的各种事情。
一方面,这允许您编写非常高效的代码,因为所有检查都没有额外的开销,但另一方面,如果您没有完全意识到,很容易编写出以奇怪的方式崩溃的代码并注意内存分配的工作原理。
创建 Java 等语言的一个重要原因是让开发人员不必担心这些问题。一方面,Java 是 "safer",但另一方面,性能受到影响。
有人可以解释一下这个数组在没有数组大小的情况下是如何工作的吗?
#include <stdio.h>
int main(void) {
int a[]={},i;
for(i=0;i<=3;i++)scanf("%d",&a[i]);
printf("\n\n");
for(i=0;i<=3;i++)printf("%d ",a[i]);
return 0;
}
在 C 中,没有像 Java 这样的语言那样在 运行 时检查数组长度。在此代码中,在内存中的某个位置创建了一个空数组。当使用 a[i]
访问数组时,将根据元素的大小(在本例中为 int
的大小)计算内存位置,并访问该内存位置,无论您是否真的希望它被访问与否。 C 让您可以自由地做现代语言不允许的各种事情。
一方面,这允许您编写非常高效的代码,因为所有检查都没有额外的开销,但另一方面,如果您没有完全意识到,很容易编写出以奇怪的方式崩溃的代码并注意内存分配的工作原理。
创建 Java 等语言的一个重要原因是让开发人员不必担心这些问题。一方面,Java 是 "safer",但另一方面,性能受到影响。