c中内存分配的问题



我是C语言的新手,我尝试编写函数来为2d数组分配内存我在做什么:

void allocate(int **arr, int r, int c) 
{
**arr = (int **)malloc(r*c*sizeof(int));
}
int main( void )
{
int NO_OF_COLS = 0;
int NO_OF_ROWS = 0;    
scanf("%d%d", &NO_OF_ROWS, &NO_OF_COLS);
int **matrix;

allocate(matrix, NO_OF_ROWS, NO_OF_COLS);
return 0;
}

我有这个警告:从'int **'中对'int'赋值使指针的整数不进行强制转换[-Wint-conversion]8 | * * arr = (int * *) malloc (r csizeof (int));| ^

我知道我在分配()中传递内存给'矩阵',但我不明白我如何返回新的内存地址并将其分配给矩阵

我尝试将allocate(matrix, NO_OF_ROWS, NO_OF_COLS);更改为allocate(&matrix, NO_OF_ROWS, NO_OF_COLS);,但它仍然不起作用

由于不能修改allocate的参数,因此需要手动计算矩阵中每个元素的索引。下面的基本程序展示了如何访问5 x 5矩阵的每个元素。

#include <stdio.h>
#include <stdlib.h>
void allocate(int **arr, int r, int c)
{
*arr = malloc(sizeof (int) * r * c); 
}
int main(void)
{
int *arr = NULL;
int NO_OF_ROWS = 5, NO_OF_COLS = 5;
allocate(&arr, NO_OF_ROWS, NO_OF_COLS);
for (int r = 0; r < NO_OF_ROWS; ++r) {
for (int c = 0; c < NO_OF_COLS; ++c) {
printf("arr[%d]n", r * NO_OF_COLS + c); 
}   
}   
}

这里,我们实际上使用的是一维数组。在循环内部,r * NO_OF_COLS + c负责访问每个元素。这个程序将打印arr[0],arr[1]arr[24]。您可以使用这个逻辑来计算每个元素的索引。

main()内部,arr只是一个指向int的指针。当我们将arr地址传递给allocate()时,我们给了allocate()修改arr的机会。然后,在allocate()中,我们跳转到传入的地址,并放置malloc返回的位。

首先,您需要分配一个数组的数组来保存数据。你需要分配一个数组来保存N个指针类型的元素。想想看:

int** allocate(int row, int col)
{
int i;
int** a = (int**) malloc(row * sizeof(int*));
if (!a)
return  0;
for(i=0; i < row; i++) {
a[i] = (int*) malloc(sizeof(int) * col);
}
return  a;
}

您需要分配a来保存N个元素,这些元素是指向int数组的指针,然后循环并分配用例中所需的实际数组(sizeof(int) * col)。下面是用法:

int main()
{
int** a= allocate(10, 10);
int i=0, j=0;
for(i=0; i < 10; i++) {
for(j=0; j < 10; j++) {
a[i][j] = 42;
}
}
for(i=0; i < 10; i++) {
for(j=0; j < 10; j++) {
printf("[%d]", a[i][j]);
}
puts("");
}
return 0;
}

还需要以同样的方式编写一个释放函数,但首先必须循环遍历所有元素并在释放a数组之前释放数组。[编辑]:为了简单起见,我没有在第二个malloc中添加故障安全检查。给定该示例和函数原型,您需要将1D数组分配为:

void allocate(int** a, int row, int col)
{
*a = malloc(sizeof(int) * row * col);
}

但这和分配数组的数组不同

相关内容

  • 没有找到相关文章

最新更新