codice:
#include <stdio.h>
/* Macro per determinare le dimensioni di un array */
#define ARRSIZE(arr)    ((size_t)(sizeof(arr)/sizeof(*arr)))
/* Funzione richiamata ricorsivamente da WriteCombinations */
void InternalWriteCombinations(int * values, size_t elements, int seqLength, char * buffer, char * writePtr, size_t availableSize);
/* Scrive le combinazioni di simboli contenuti nell'array values (il numero dei suoi elementi è contenuto in elements); le combinazioni saranno lunghe seqLength caratteri */
void WriteCombinations(int * values, size_t elements, int seqLength);

int main()
{
    int values[]={1,2,3}; /* valori da utilizzare */
    WriteCombinations(values,ARRSIZE(values),3); /* l'ultimo parametro è la lunghezza delle sequenze */
    return 0;
}

void InternalWriteCombinations(int * values, size_t elements, int seqLength, char * buffer, char * writePtr, size_t availableSize)
{
    int i, usedChars;
    for(i=0; i<elements; i++)
    {
        usedChars=_snprintf(writePtr,availableSize,"%d ",values[i]);
        if(seqLength>1)
            InternalWriteCombinations(values,elements,seqLength-1,buffer, writePtr+usedChars,availableSize-usedChars);
        else
            puts(buffer);
    }
}

void WriteCombinations(int * values, size_t elements, int seqLength)
{  
    char buffer[512];
    InternalWriteCombinations(values, elements, seqLength, buffer, buffer, ARRSIZE(buffer));
}