Permutation code in C
There are only two versions of the main function:

/* 1 */
int main(int argc, char *argv[]) { ... }

/* 2 */
int main(void) { ... }


Note the void keyword in the second version. In C, if the function has no parameters it should be declared as

 &lt;type&gt; f(void)


Please, take a look at this SO answer for details.
Do not write one-line code:


for(int i = 0; i &lt; counter; i++) if(strcmp(store_arr[i],arr_to_print)==0) return 1;



I'd rewrite it this way:

for (int i = 0; i &lt; count; i++)
    if (strcmp(store_arr[i], arr_to_print) == 0)
        return 1;

Do not use int as type for array indexing. It is not guaranteed  that int can hold any possible index value of an array object. The only type that can hold any index of an array object is size_t. See this SO answer for details.
I'd replace

printf("\n");


with

putchar('\n');

Do not cast the result of malloc call. Really, you have to do it in C++, but not in C. See this SO question for details.
Do not repeat yourself. Consider this line:


int* n_arr = malloc(length * sizeof(int));



You declare n_arr as a pointer to int. It would be better to rewrite this line in this way:

int *n_arr = malloc(length * sizeof *n_arr);


In this case you don't have to change the expression of the sizeof operator if you change n_arr type. It is very common C idiom.
Do not computer factorial using recursion. It is really slow. Usually, you can just create the factorial table and hardcode it:

static const unsigned long long factorial_table[] = {
    1,
    2,
    6,
    24,
    120,
    720,
    ...
};

In this line:


char* src_arr = "ABCDE";



you create a pointer to a string literal. It would be better to create just a static array:

static src_arr[] = "ABCDE";

And you can make it const since it never changes:

static const src_arr[] = "ABCDE";