C中的内存分配问题
Problems with memory allocation in C
我是 C 语言的新手,我尝试编写函数来为二维数组分配内存
我在做什么:
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(rcsizeof(int));
| ^
我知道我在 allocate() 中将内存传递给 'matrix',但我不明白我如何 return 新的内存地址并将其分配给矩阵
我尝试将allocate(matrix, NO_OF_ROWS, NO_OF_COLS);
更改为allocate(&matrix, NO_OF_ROWS, NO_OF_COLS);
,但还是不行
首先你需要分配一个数组数组来保存数据。您需要分配一个数组来保存 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
来保存指向 int
数组的 N 个元素,然后在您的用例中循环并分配所需的实际数组 ( 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
添加故障安全检查。
鉴于该示例和函数原型,您需要将一维数组分配为:
void allocate(int** a, int row, int col)
{
*a = malloc(sizeof(int) * row * col);
}
但这与分配数组的数组不同。
由于您无法修改 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
.
返回的位
我是 C 语言的新手,我尝试编写函数来为二维数组分配内存 我在做什么:
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(rcsizeof(int)); | ^
我知道我在 allocate() 中将内存传递给 'matrix',但我不明白我如何 return 新的内存地址并将其分配给矩阵
我尝试将allocate(matrix, NO_OF_ROWS, NO_OF_COLS);
更改为allocate(&matrix, NO_OF_ROWS, NO_OF_COLS);
,但还是不行
首先你需要分配一个数组数组来保存数据。您需要分配一个数组来保存 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
来保存指向 int
数组的 N 个元素,然后在您的用例中循环并分配所需的实际数组 ( 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
添加故障安全检查。
鉴于该示例和函数原型,您需要将一维数组分配为:
void allocate(int** a, int row, int col)
{
*a = malloc(sizeof(int) * row * col);
}
但这与分配数组的数组不同。
由于您无法修改 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
.