Palindrome numbers - Project Euler Problem 4
First of all, you are only interested in the biggest number, so why do you start from the bottom??
Correcting that allows you to dispense with an explicit lower boundary, a dynamic boundary can be computed depending on current-best result.
Why don't you read the upper boundary from the command-line?
Proper indentation is a very valuable help in quickly and accurately reading source-code, as well as ferreting out errors.
In your case, the one level of indentation missing through much of your code might be an artifact of sloppy posting here. Whether or not it is, don't do that.
You are depending on implicit definition of palindrome. Don't do that, reverse their positions.
An int only has a guaranteed range of -32767 to 32767. Use a long (or unsigned long), that has the proper range without depending on implementation-dependent behaviour.
Why do you use an array and all that paraphernalia to check for being a palindrome, simply reversing is easy:

unsigned long reverse(unsigned long in) {
    unsigned long r = 0;
    for(; in; in /= 10)
        r = r * 10 + in % 10;
    return r;
}



Final program (on coliru):

#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

static int is_palindrome(const unsigned long in) {
    unsigned long r = 0;
    for(unsigned long x = in; x; x /= 10)
        r = r * 10 + x % 10;
    return r == in;
}

int main(int argc, char* argv[]) {
    unsigned long max = argc &gt; 1 ? strtoul(argv[1], 0, 10) : 0;
    if(!max || max &gt; 9999)
        max = 999;
    unsigned long _a = 0, _b = 0, _m = 0; // best yet
    for(unsigned long a = max, a_min = 1; a &gt;= a_min; --a)
        for(unsigned long b = max, b_min = _m / a + 1; b &gt;= b_min; --b)
            if(is_palindrome(a*b)) {
                _a = a, _b = b, _m = a*b, a_min = _m / max + 1;
                break;
            }
    printf("Biggest palindrome-number which is product of two natural numbers"
        " no bigger than %lu: %lu = %lu * %lu\n", max, _m, _a, _b);
    return 0;
}