前提・実現したいこと

任意の桁数の2進数の全通りを配列に格納してそれを出力するようなプログラムを作りたいです.
例えば,2桁であれば

[1,1]
[0,1]
[1,0]
[1,1]

三桁であれば

[1,1,1]
[0,1,1]
[1,0,1]
[0,0,1]
[1,1,0]
[0,1,0]
[1,0,0]
[0,0,0]

というふうに格納・出力をしたいですが,以下のような出力になってしまいます.
どこがおかしいのか,どなたか教えてください...

発生している問題・エラーメッセージ

3桁の時について,
出力すると

0 0 1 
1 0 0 
0 0 32563 
0 32765 0 
32765 0 0 
1664188935 3 -1 

というように,代入がうまくできていないようです...

#include<stdio.h>

int pow_2(int digit);   /*2の引数乗を戻す*/
void make_binary(int len1,int len2, int n, int (*a)[n]);    
/*len1(=len2)×nの二次元配列に0または1を代入し,n桁?の全ての2進数を作成*/
int main(void){
    int i,j;
    int digit,len;
    digit=3;
    len=pow_2(digit);
    int a[len][digit]; /*ここでは,3桁の二進数(先頭が0でも良い)が8通り存在するので8×3の配列を用意*/
    make_binary(len, len, digit-1,a);

    for(i=0; i<len; i++){
        for(j=0; j<digit; j++){
            printf("%d ",a[i][j]);
        }
        printf("\n");
    }

    return 0;
   }
int pow_2(int digit){
    int i;
    int a=1;
    for(i=0; i<digit; i++){
        a=a*2;
    }
    return a;
}
void make_binary(int len1,int len2, int n, int (*a)[n]){
    int i,j;
    i=0;
    if (n==-1){
         return ;
    }
    else{
        while(i<len1){
            for(j=0; j<len2/2; j++){
                printf("%d %d ",i,j);
                printf("\n");
                a[i++][n]=1;
            }
            for(j=len2/2; j<len2; j++){
                printf("%d   %d ",i,j);
                printf("\n");
                a[i++][n]=0;
            }
        }
        make_binary(len1, len2/2, n-1, a);
    }
}