Is there any way to make my function return a dynamic array?

Functions cannot return arrays, period. You can of course a pointer or take a pointer to a block of memory that has been allocated by the caller. So, in your case...

int *ret = malloc(255 * sizeof int);  // caller must deallocate!

This does change the semantics of your code however. The caller of your function is now responsible for calling free() on the returned pointer. If they do not you will leak memory, so this adds some amount of complexity that did not exist before. I would prefer something like this instead:

void charpos(int *p, size_t size, const char *str, char ch) {
    // initialize the memory 
    memset(p, 0, size * sizeof int);
    
    // your other code here...

    size_t len = strlen(str);
    // fill the caller's memory
    for(i = 0; i < len; ++i)
    {
        if(str[i] == ch)
            p[bc++] = i;
    }
}

You're returning a pointer to int which referes to the first element of a statically allocated array.