我以为这会出现一些错误,因为没有malloc.
数组就无法在c中动态初始化,但是它确实可以工作而不显示任何错误。这是编译器相关的东西吗?如果可能的话,如何不使用realloc
来重新分配内存?
#include <stdio.h>
//no error is shown
int main()
{
int n;
n=5;
char ptr[n];
printf("%d",sizeof(ptr));
n=20;
ptr[n+10];
printf("%d",sizeof(ptr));
}
ptr[n+10];
不会调整数组的大小-它只是尝试访问其边界之外的元素,该元素的行为为
undefined。它may会导致运行时错误,也可能不会。
尽管有其名称,但一旦定义了可变长度数组,就无法调整其大小。可变长度中的“可变”仅表示每次定义它们的大小都可以不同。 如果要在运行时为数组分配内存,然后能够调整该数组的大小,则需要使用标准库中的*alloc
例程:
int n = 5; char *ptr = malloc( sizeof *ptr * n ); ... n = 20; char *tmp = realloc( ptr, sizeof *ptr * (n + 10) ); if ( tmp ) ptr = tmp;
请注意,sizeof ptr
仅会为您提供char *
的大小,而不会为您分配已分配的内存量;您必须分别跟踪数组大小。