数组和C中的malloc



你好,我是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;
}

相关内容

  • 没有找到相关文章

最新更新