C中的二维数组malloc>错误?

时间:2014-12-02 12:30:05

标签: c

我正在尝试制作二维数组函数,但不知何故它不起作用。代码在这里:

#include <stdio.h>
#include <stdlib.h>

int **multiTable (unsigned int xs, unsigned in ys)

{
unsigned int i, j;

int **table = int(**)malloc(xs * ys * sizeof(int*));
for(i = 0; i < ys; i++)
{
    for(j = 0; j < xs; j++)
    {
       table[i][j] = j * i;
    }


}
free(**table);
return table;


}

首先,我是否应该在malloc中添加行(xs)?或者它应该工作,如果我只使用列? - &GT;像这样:

int **table = int(**)malloc(ys * sizeof(int*));

3 个答案:

答案 0 :(得分:1)

这不会起作用,因为指针数组int **table不是连续的,它不等同于2d数组table[a][b]

但是,如果要使用单个malloc,则可以使用指向数组的指针。

int (*table)[xs] = malloc( ys * sizeof(*table));
for( int i = 0; i < ys; i++)
{
    for( int j = 0; j < xs; j++)
    {
       table[i][j] = i;
    }
}
free( table ) ;

在你的回复电话发布后,请不要将table退回。

答案 1 :(得分:1)

看来你的意思是以下

int ** multiTable( unsigned int xs, unsigned int ys )
{
    unsigned int i, j;

    int **table = malloc( ys * sizeof( int * ) );

    for ( i = 0; i < ys; i++ )
    {
        table[i] = malloc( xs * sizeof( int ) );
        for ( j = 0; j < xs; j++ )
        {
           table[i][j] = j * i;
        }
    }

    return table;
}

答案 2 :(得分:0)

'table'是一个二维指针。首先要了解什么是2D指针。指针是一种特殊类型的变量,用于存储另一个变量的地址。因此,2D指针是一个特殊变量,它再次用于存储指针变量的地址。

现在假设你有一个指针数组(不同1-D数组的基地址集合),它将存储许多1-D数组的基地址。

要为这个指针数组动态分配内存,需要使用语句

table=(int**)malloc(sizeof(int*)*xs);   

现在你有一个带有'xs'个元素的数组,你可以通过table [0],table [1],table [2] ..等来访问每个元素,但是这些都不是数组分配内存。所以你需要使用这样的循环分别为每个数组分配内存:

for(i=0;i<xs;i++)
    table[i]=(int*)malloc(sizeof(int)*ys);

所以你的整体计划变成了:

int **table; // table is a 2D pointer

table=(int**)malloc(sizeof(int*)*xs);
for(i=0;i<xs;i++)
    table[i]=(int*)malloc(sizeof(int)*ys);

for(i = 0; i < ys; i++)
{
    for(j = 0; j < xs; j++)
    {
       table[i][j] = j * i;
    }
}
return table;

在返回之前,您不需要释放数组。这样做会使你的指针'table'成为一个悬空指针,仍然指的是一个不再分配的内存,所以只返回'table'而没有语句:

free(table);

上述声明将导致一个没有接入点的悬空内存,因此无用。这是一个内存泄漏问题,当内存累积时会出现这种问题,并且这个内存不能通过你的程序访问,也不能被重新定位用于其他目的,这样的内存称为悬空内存。