Of course you are right that it's not the same as using e.g. a Python List.
Furthermore, neither does any memory management, the memory is retained till the end of the program. "Simple memory acquisition" perhaps, "memory management" not, except if we accept it as a degenerate case, where things aren't even freed except when the program ends.
And the difference between 'char buf[size]' and 'char *buf = alloca(size)' isn't significant enough to put the two in separate paradigms IMO, just slightly different ways of writing the same thing.
I see, but you still have to ask nicely for it explicitly.
Well, anything that ends up allocating some memory for you and giving you back handler would be also "slightly different syntax for the same thing".
I'd say that the first case abstracts away the allocation though, while the second makes it explicit. It's just too small an example to be that big of a difference.
Another thing that comes to mind, is that you can just write:
char buf[4] = "foo";
to initialize the string, whereas with alloca you'd need something like:
char* buf = alloca(4); strcpy(buf, "foo");
Isn't the latter quite more manual?
In the literature though, you may find that "manual" memory management usually refers to memory management where the programmer has to call a 'free'-style function manually, while automatic memory management usually refers to anything where the programmer doesn't have to call 'free' (be it thanks to lifetimes or GC or automatic refcounting or whatever).