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;
}