C 中的数组和 malloc
Arrays and malloc in C
你好,我是 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()
重新调整先前分配的内存位置。
您可以阅读 man page 了解更多详情。
此外,在 C
中使用动态内存时,您需要注意 C
中没有 垃圾收集器。您需要 free()
增加 you 分配的每一位内存。
我知道在 C 中,数组必须用数字而不是变量初始化,就像在 Java
中那样
在 C99 及以后,variable initiated arrays可用。
我当前的问题是尝试初始化一个未知数的数组。
和:
但我正在寻找一种在递增数组的同时执行此操作的方法。
如果您在 运行 时有未知数量的元素,您可以编写一个函数来创建(和释放)内存,并在需要时传递相关参数。下面是创建(和释放)二维整数数组的函数示例:
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;
}
你好,我是 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()
重新调整先前分配的内存位置。
您可以阅读 man page 了解更多详情。
此外,在 C
中使用动态内存时,您需要注意 C
中没有 垃圾收集器。您需要 free()
增加 you 分配的每一位内存。
我知道在 C 中,数组必须用数字而不是变量初始化,就像在 Java
中那样
在 C99 及以后,variable initiated arrays可用。
我当前的问题是尝试初始化一个未知数的数组。
和:
但我正在寻找一种在递增数组的同时执行此操作的方法。
如果您在 运行 时有未知数量的元素,您可以编写一个函数来创建(和释放)内存,并在需要时传递相关参数。下面是创建(和释放)二维整数数组的函数示例:
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;
}