I know command line arguments are character arrays and they are stored on stack. But I want to know actual memory allocated for of each argument. e.g. suppose I passed directory name "/tmp" as command line argument. This will be stored in argv. But as I tested, it is allowed to change argv to "/tmp/log/" (size increased) in program. How is this possible ?
To answer your question, the total maximum size available to argument strings and the passed environment can be obtained with:
from the command line or the syconf equivalent from C (see http://pubs.opengroup.org/onlinepubs/009695399/basedefs/limits.h.html for more information). (On my Linux box, the limit is 2097152).
Your example happens to work because the arguments and the environment are realistically stored contiguously, so appending to a string will overwrite what comes after it (following arguments, or the environment). And that's why it's a bad idea to try and expand the argv strings like that. If you want to modify them, either edit them or shrink them, but trying to expand them is a call for trouble.