在不指定最大大小的情况下在 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
}
使用malloc/new进行动态分配时必须指定数组的大小。
我现在正在重新学习 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
}
使用malloc/new进行动态分配时必须指定数组的大小。