The structure sh -c word executes only word (in a shell).
Added words mean other things, like argument zero, one, two, etc.:
sh -c word zero one two three
to keep a command which has spaces as one word, quoting is needed:
sh -c 'echo fnord' zero one two three
so, this prints all the arguments:
$ sh -c 'echo "args=" "$0" "$@"' zero one two three
args = zero one two three
Examples
In the example you present: /bin/sh -c echo foo The first word (after options) is echo, that is what is executed. And an echo with no text will print a new-line only, nothing else:
$ /bin/sh -c echo foo
That is why you do get an empty line.
If you quote the space, you will be executing "one word" (no spaces), as this:
$ /bin/sh -c echo\ foo
foo
$ /bin/sh -c "echo foo"
foo
$ /bin/sh -c 'echo foo'
foo
Conclusion
Keep the executed command as one "word" using quoting.