你好,我是C的新手,需要有人向我解释概念。我是一名JAVA程序员,正在尝试用C编写程序。我目前的问题是尝试初始化一个未知数字的数组。我知道在C中,数组必须用数字初始化,而不是像Java中那样用变量初始化。我的问题是,如果我能在Java中做到这一点:
int i = 0;
char array [i];
void f(){
\some code
i++;
}
如何在C中执行此操作?我试图用从文件中获得的某些字符串填充数组。我不知道我会从文件中得到多少。我试着读过关于malloc的书,但在一个教程中它说:
int *pointer;
pointer=malloc(2*sizeof(int));
相当于
int array[2];
但我正在寻找一种方法来实现这一点,同时递增数组。
首先要提到的是,malloc()
和系列用于动态(运行时)内存分配,而int arr[2]
通常表示编译时内存分配。它们并不完全等同于。
然而,若你们想随时调整分配的内存大小,那个么你们的做法是正确的。接下来需要做的是使用realloc()
重新调整先前分配的内存位置的大小。
您可以阅读手册页了解更多详细信息。
此外,当在C
中使用动态内存时,您需要在中间保持C
中没有垃圾收集器。您需要free()
占用您分配的每一位内存。
我知道在C中,数组必须用数字初始化,而不是像在Java中那样用变量初始化
在C99
及更高版本中,变量启动数组可用。
我当前的问题是试图初始化一个未知数字的数组
和
:
但我正在寻找一种方法来实现这一点,同时递增数组
如果在运行时有未知数量的元素,可以编写一个函数来创建(并释放)内存,根据需要传递相关参数。下面是一个创建(并释放)2维int数组的函数示例:
int ** Create2Dint(int **arr, int cols, int rows)
{
int space = cols*rows;
int y;
arr = calloc(space, sizeof(int));
for(y=0;y<cols;y++)
{
arr[y] = calloc(rows, sizeof(int));
}
return arr;
}
void free2DInt(int **arr, int cols)
{
int i;
for(i=0;i<cols; i++)
if(arr[i]) free(arr[i]);
free(arr);
}
如果在执行过程中需要更改内存分配(更改数组的大小),可以使用realloc(),在这里以类似的方式实现:
int ** Realloc2D(int **arr, int cols, int rows)
{
int space = cols*rows;
int y;
arr = realloc(arr, space*sizeof(int));
for(y=0;y<cols;y++)
{
arr[y] = calloc(rows, sizeof(int));
}
return arr;
}
用法示例:
(使用两个整数命令行参数执行,两者均大于0)
int main(int argc, char *argv[])
{
int **array = {0};
int cols, rows;
cols = atoi(argv[1]);
rows = atoi(argv[2]);
array = Create2Dint(array, cols, rows);
//Do stuff here to use array
//Memory requirements change during runtime:
cols += 20;
rows += 50;
array = Realloc2D(array, cols, rows);
//use array again...
//When you are finished with the memory, free it:
free2DInt(array, cols);
return 0;
}