动态数组,传递地址

时间:2018-08-18 14:10:08

标签: c function multidimensional-array dynamic pass-by-reference

我想制作一个函数,该函数的参数是我动态分配的二维数组,问题是我不知道如何构建函数。

这是我的主物品(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上进行了一些搜索,但是找不到包含“动态分配”和“通过引用传递”的主题,如果存在,请告诉我。

如何构建此功能?

2 个答案:

答案 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