无需重新分配系统调用即可重新分配数组

问题描述 投票:-1回答:1

我以为这会出现一些错误,因为没有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));  
}
c arrays pointers
1个回答
0
投票
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 *的大小,而不会为您分配已分配的内存量;您必须分别跟踪数组大小。

© www.soinside.com 2019 - 2024. All rights reserved.