我想制作一个函数,该函数的参数是我动态分配的二维数组,问题是我不知道如何构建函数。
这是我的主物品(N_MAX定义为300):
int i;
int **Bord = NULL;
Bord = malloc(N_MAX * sizeof(*Bord));
if(Bord == NULL)
{
printf("Error while allocating memory to an array");
free(Bord);
return -1;
}
for(i = 0; i < N_MAX; i++)
{
printf("%d\n", i);
Bord[i] = malloc(N_MAX * sizeof(*(Bord[i])));
if(Bord[i] == NULL)
{
printf("Error while allocating memory to an array");
while(i != 0)
{
free(Bord[i]);
i--;
}
free(Bord);
return -1;
}
}
我试图对不能动态分配的数组做些事情,但这确实很糟糕。当我想调试该函数时,我的表可以工作(我的数组中的数字正确),但是程序不起作用(错误:一元'*'(类型为'int')的无效类型参数)>
我已经在Google上进行了一些搜索,但是找不到包含“动态分配”和“通过引用传递”的主题,如果存在,请告诉我。
如何构建此功能?
答案 0 :(得分:0)
在尝试猜测“新”功能的外观之前,让我们纠正发布的代码中的(很多)问题。
// added missing `#include` statements
#include <stdio.h>
#include <stdlib.h>
// added missing definition of N_MAX
#define N_MAX 300
int main( void ) // corrected signature for 'main'
{
//int i;
// minimize the scope of variables
int **Bord = NULL;
//edited following line
Bord = malloc(N_MAX * sizeof(*Bord));
if(Bord == NULL)
{
//printf("Error while allocating memory to an array");
// error messages should be output to 'stderr', not 'stdout'
// suggest:
perror( "malloc failed" );
//free(Bord); DONT do this, the allocation was not successful
return -1;
}
// implied else, malloc was successful
for( int i = 0; i < N_MAX; i++)
{
printf("%d\n", i);
Bord[i] = malloc(N_MAX * sizeof(*(Bord[i]));
if(Bord[i] == NULL)
{
//printf("Error while allocating memory to an array");
// error messages should be output to 'stderr', not 'stdout'
// suggest:
perror( "malloc failed" );
//while(i != 0)
// this will not free the first sub allocation
// suggest
i--;
while( i >= 0 )
{
free(Bord[i]);
i--;
}
free(Bord);
return -1;
}
}
// the following will result in a memory leak
// because all those memory allocations have not been passed to 'free()'
return 0;
}
答案 1 :(得分:0)
这是一个简单的程序,它说明了两个功能:init_array()
用于在(或多或少)问题代码创建数组后初始化数组,而print_array()
在数组中打印值。数组。除了合理划分职责外,这两个功能还显示init_array()
中的设置在print_array()
中可见。还有一个很小的函数free_array()
,由static inline
制成,它释放数组的已分配数据-它处理部分和完全分配的数组。除main()
以外的所有功能都标记为static
,因为没有其他文件需要查看任何功能。请注意,为了便于测试,我将N_MAX
设置为8,而不是300。现在我知道它正在工作,将N_MAX
设置为300是可行的,也可能是明智的。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
static void print_array(int **base);
static void init_array(int **base);
enum { N_MAX = 8 };
static inline void free_array(int n_rows, int **array)
{
for (int i = 0; i < n_rows; i++)
free(array[i]);
free(array);
}
int main(void)
{
int i;
int **Bord = NULL;
srand(time(0)); // Not good, but better than nothing
Bord = malloc(N_MAX * sizeof(*Bord));
if (Bord == NULL)
{
fprintf(stderr, "Error while allocating %zu bytes of memory\n", N_MAX * sizeof(*Bord));
return -1;
}
for (i = 0; i < N_MAX; i++)
{
Bord[i] = malloc(N_MAX * sizeof(*(Bord[i])));
if (Bord[i] == NULL)
{
fprintf(stderr, "Error while allocating %zu bytes of memory\n", N_MAX * sizeof(*Bord[i]));
free_array(i, Bord);
return -1;
}
}
init_array(Bord);
print_array(Bord);
free_array(N_MAX, Bord);
return 0;
}
static void init_array(int **base)
{
for (int i = 0; i < N_MAX; i++)
{
for (int j = 0; j < N_MAX; j++)
base[i][j] = (100 * (i + 1)) + (10 * (j + 1)) + rand() % 10;
}
}
static void print_array(int **base)
{
for (int i = 0; i < N_MAX; i++)
{
printf("[%d]:", i);
for (int j = 0; j < N_MAX; j++)
printf(" %3d", base[i][j]);
putchar('\n');
}
}
请注意,它使用time()
来初始化随机数生成器,因此通常除非每次在一秒钟内多次调用它,否则每次调用它通常都会生成一组新的数字。
[0]: 115 121 137 142 159 166 175 181
[1]: 211 224 239 248 253 265 277 283
[2]: 316 320 337 349 357 364 376 380
[3]: 419 428 439 448 451 469 476 484
[4]: 511 527 534 544 558 569 578 585
[5]: 616 623 631 647 650 664 671 688
[6]: 710 729 739 748 759 766 779 783
[7]: 817 824 839 847 850 860 878 881