我正在尝试制作二维数组函数,但不知何故它不起作用。代码在这里:
#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*));
答案 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);
上述声明将导致一个没有接入点的悬空内存,因此无用。这是一个内存泄漏问题,当内存累积时会出现这种问题,并且这个内存不能通过你的程序访问,也不能被重新定位用于其他目的,这样的内存称为悬空内存。