在C中创建动态数组而不指定最大大小

我现在正在重新研究C,并且一直有人告诉我,在C中,我们必须定义将具有数组的最大大小,以便可以在内存中保留足够的空间。我的意思是:

#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*10 );
       enteros++;
   }
}

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

xiezhanliang 回答:在C中创建动态数组而不指定最大大小

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

但这只是问题的根源。实际的问题是,如果您有大量的代码并且内部存在分配问题,则将很难找到意外的程序行为和运行时错误。如果在生产中发生,那将是巨大的。在大多数其他语言中,这是不可能发生的,但是在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",*a); // value did not change
}

https://repl.it/repls/SoggyOverdueFactors

,

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

本文链接:https://www.f2er.com/3044959.html

大家都在问