Maximum subarray problem solved with divide and conquer also for the all negative element case
Bugs


Your sum in max_cross_sub() could overflow an int, causing a change in sign.  Therefore, you could either miss the maximum subarray if your sum erroneously became negative, or get the wrong subarray if your sum erroneously became positive.
It seems that you want lower and upper to return the bounds of the maximum subarray.  Otherwise you could just pass those arguments as regular integers instead of pointers.  However, max_sub() doesn't set the correct bounds in the case of cross_sum being the max sum.
In addition to #2, max_cross_sub() doesn't set *lower and *upper to the correct bounds.  The problem is that you don't set max_left and max_right correctly, so you end up leaving the bounds unchanged from whatever was passed in.
This line isn't right:

printf("%d %d\n",max_sub(a, &amp;lower, &amp;upper), max_noncont_sub(a, &amp;lower, &amp;upper));


The problem with it is that the call to max_sub() changes lower and upper, so that the call to max_noncont_sub() has the wrong bounds passed in.  You should use two separate copies of the lower and upper bounds instead.


Better way

Clearly you already knew about Kadane's algorithm, because you mentioned it.  The question is why you didn't use it?  Not only is it faster, it's also only 6 lines of code compared to the roughly 60 lines you used to do it the divide and conquer way.