Arrays 用c中给定数组元素的所有(n选择k)组合生成一个数组?

Arrays 用c中给定数组元素的所有(n选择k)组合生成一个数组?,arrays,c,combinations,Arrays,C,Combinations,我试图构造一个函数,它取给定数组元素的所有可能组合(n选择k),其中n是给定数组的长度,k是给定的数字,并将它们放入一个新数组中。为此,我首先决定创建一个中间函数int**indextab(int size,int r),该函数以给定数组的大小和给定数字(n选择k的k)作为参数,并返回一个包含给定数组的所有r大小的索引组合的表。例如,indextab(3,2)将返回{0,1},{0,2},{1,2} 这是我的代码(我承认我从互联网上复制了printCombination,并对其进行了轻微修改以符

我试图构造一个函数,它取给定数组元素的所有可能组合(n选择k),其中n是给定数组的长度,k是给定的数字,并将它们放入一个新数组中。为此,我首先决定创建一个中间函数int**indextab(int size,int r),该函数以给定数组的大小和给定数字(n选择k的k)作为参数,并返回一个包含给定数组的所有r大小的索引组合的表。例如,indextab(3,2)将返回{0,1},{0,2},{1,2}

这是我的代码(我承认我从互联网上复制了printCombination,并对其进行了轻微修改以符合我的规范):

/*arr[]-->输入数组
data[]-->临时数组到
存储当前组合
开始和结束--->开始和结束
以arr[]结束索引
索引--->数据中的当前索引[]
r--->要打印的组合的大小*/
void组合util(int arr[],int data[],
int开始,int结束,
整数索引,整数r,整数**选项卡,整数len)
{
//当前组合已准备就绪
//要打印,请打印它
如果(索引==r)
{
对于(int i=0;i=r-index”
//确保包含一个元素
//at索引将与
//剩余位置的剩余元素
for(inti=start;i=r-index;i++)
{
数据[索引]=arr[i];
组合Util(arr,数据,i+1,
结束,索引+1,r,tab,len);
}
}
//C++程序打印所有组合
//大小为r的数组,大小为n
//打印的主要功能
//大小为r的所有组合
//在arr[]中,尺寸为n。此函数
//主要使用combinationUtil()
无效打印组合(整数arr[],整数n,整数r,整数**选项卡,整数len)
{
//要存储的临时数组
//一个接一个的组合
int数据[r];
//使用打印所有组合
//临时数组“数据[]”
组合util(arr,data,0,n-1,0,r,tab,len);
}
整数事实(整数c,整数n){
如果(n==1){
返回c;
}
返回事实(c*n,n-1);
}
int findNumberComb(int n,int r){
返回事实(1,n)/(事实(1,r)*事实(1,n-r));
}
int**indextab(int大小,int r){
int*tab=malloc(size*sizeof(int));
对于(int i=0;i
下面是我测试它的主要方法:

int main()
{
    int **tab = indextab(10, 3);
    for (int i = 0; i < findNumberComb(10, 3); i++){
        for (int j = 0; j < 3; j++){
            printf("%d ", tab[i][j]);
        }
    }
}
intmain()
{
int**tab=indextab(10,3);
对于(int i=0;i
但这会产生分段错误11。我想这可能意味着我的indextab函数中的“res”选项卡太小了,但在我看来findNumberComb(size,r)rsizeof(int)应该是正确的malloc大小。请注意,在combinationUtil中,我使用了一种非常非最佳的方式来用组合填充选项卡,这是因为我不知道如何在内存中放置正确的索引。但是,我不明白为什么这不起作用

编辑:感谢评论中的帮助,我将我的功能更改为:

int **indextab(int size, int r){
    int *tab = malloc(size*sizeof(int));
    for (int i = 0; i < size; i++){
        tab[i] = i;
    }
    int len = findNumberComb(size, r);
    int **res = calloc(len, r*sizeof(int*)*sizeof(int));
    printCombination(tab, size, r, res, len);
    return res;
}
int**indextab(int大小,int r){
int*tab=malloc(size*sizeof(int));
对于(int i=0;i
这避免了分段错误,但我的main打印的值太大,有时是负数

有人能帮忙吗?

如果(tab[i]==NULL)
:这里您可以访问
tab[i]
,但是
tab
指向的内存从未初始化过。请注意,
malloc
分配的内存内容尚未确定。查看
calloc
函数。
int **indextab(int size, int r){
    int *tab = malloc(size*sizeof(int));
    for (int i = 0; i < size; i++){
        tab[i] = i;
    }
    int len = findNumberComb(size, r);
    int **res = calloc(len, r*sizeof(int*)*sizeof(int));
    printCombination(tab, size, r, res, len);
    return res;
}