在不指定最大大小的情况下在 C 中创建动态数组

Creating a dynamic array in C without specifying the maximum size

我现在正在重新学习 C,我一直被告知,在 C 中,我们必须定义数组的最大大小,以便它可以在内存中保留足够的 space。我的意思是:

#include <stdlib.h> //Para función malloc

int main() {

   int *enteros = malloc( sizeof(int) * 10 ); //An array of 10 integers
   int i;
   for(i = 0; i < 100; i++) {
      enteros[i] = i*10;
      printf( "-> enteros[%d] = %d\n", i, i*10 );
   }
}

但是,下面的代码运行良好(这里我没有告诉最大大小,我只是为指向 int 的指针分配了足够的内存),我就是找不到这里发生的事情的答案。

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *enteros = malloc( sizeof(int) );
    int i;
    for(i = 0; i < 2000; i++) {
       *(enteros++) = i*10;
       printf( "-> enteros[%d] = %d\n", i, i*10 );
       enteros++;
   }
}

似乎我可以很好地管理动态数组,而不必为数组重新分配内存并被迫引入起始大小,但是我觉得我遗漏了一些东西。

是的,您可以编译并运行代码,但您可以将数据写入其他变量保留的地址。

但这只是问题的根源。实际问题是,如果您有大量代码并且内部存在分配问题,您会遇到意想不到的程序行为和 运行 时间错误。如果在生产中发生,这可能是戏剧性的。这在大多数其他语言中不会发生,但在 C 中,开发人员负责。

以这段代码为例:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *enteros = malloc( sizeof(int) );
    int *a = malloc( sizeof(int));
    int i;
    *a = 4; // value setup
    for(i = 0; i < 2000; i++) {
       *(enteros++) = i*10;
       printf( "-> enteros[%d] = %d\n", i, i*10 );
       enteros++;
   }
   printf( "a = %d\n", *a); // value changed!!!
}

然后注释掉仔细检查:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int *enteros = malloc( sizeof(int) );
    int *a = malloc( sizeof(int));
    int i;
    *a = 4;
    for(i = 0; i < 2000; i++) {
       // *(enteros++) = i*10;
       // printf( "-> enteros[%d] = %d\n", i, i*10 );
       enteros++;
   }
   printf( "a = %d\n", *a); // value did not change
}

https://repl.it/repls/SoggyOverdueFactors

使用malloc/new进行动态分配时必须指定数组的大小。