a) Hard to say for sure, but I'm guessing it has to do with how you make your recursive call, i.e. something to do with end_search/2 not always being what you want. Learn to use a debugger (see below).
b) Apart from the fact that it seg faults, no, it does not work. A general rule, asking us if something is correct implies laziness on your part, namely that you were too lazy to test it yourself. Try stepping through your code by hand, on paper. Use a small array, with, say, 10 or 16 elements. Also realize that your array must be sorted for a binary search to work. What happens if you can't find the number?
c) You can't get much more elegant that you have right now. That's about all there is to a binary search (except for the "not found" case I mentioned). The only thing you don't need is that return; on line 33. The else if/else ensures that you will only call the printf, then return.
As for why it seg faults, you are blowing out your call stack. Generally, with recursive functions, this is because you don't cover all possible base cases and/or your recursive calls don't narrow down the data set you are working with. In your case, it's the latter. The blue is what I typed, the green is what your program output. The red is the problem: you keep making the same recursive call.
Code:
$ gcc -g -Wall -std=c99 -o foo foo.c
$ gdb foo
GNU gdb (GDB) Fedora (7.3-43.fc15)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/cagarvin/sandbox/cprogramming/foo...done.
(gdb) r
Starting program: /home/cagarvin/sandbox/cprogramming/foo
[Thread debugging using libthread_db enabled]
Enter a number to search in the list 1-99
42
Program received signal SIGSEGV, Segmentation fault.
0x08048665 in search (num=42, array=0xbffff3ec, start_search=50, end_search=100) at foo.c:33
33 else search(num, array, end_search/2, end_search);
Missing separate debuginfos, use: debuginfo-install cyrus-sasl-lib-2.1.23-18.fc15.i686 glibc-2.14.1-6.i686 keyutils-libs-1.2-7.fc15.i686 krb5-libs-1.9.2-6.fc15.i686 libcom_err-1.41.14-2.fc15.i686 libselinux-2.0.99-4.fc15.i686 nspr-4.8.9-2.fc15.i686 nss-3.13.1-11.fc15.i686 nss-softokn-freebl-3.13.1-15.fc15.i686 nss-util-3.13.1-3.fc15.i686 openldap-2.4.24-3.fc15.i686 openssl-1.0.0g-1.fc15.i686 postgresql-libs-9.0.7-1.fc15.i686 zlib-1.2.5-3.fc15.i686
(gdb) bt
#0 0x08048665 in search (num=42, array=0xbffff3ec, start_search=50, end_search=100) at foo.c:33
#1 0x0804867f in search (num=42, array=0xbffff3ec, start_search=50, end_search=100) at foo.c:33
#2 0x0804867f in search (num=42, array=0xbffff3ec, start_search=50, end_search=100) at foo.c:33
...
#20122 0x0804867f in search (num=42, array=0xbffff3ec, start_search=50, end_search=100) at foo.c:33
#20123 0x0804867f in search (num=42, array=0xbffff3ec, start_search=50, end_search=100) at foo.c:33