Subject: Re: BUG in function parameter passing ??????
From: [email-masked] (Jeff Sturm)

29 Aug 1998 00:58:13 -0700
Message-ID: <[email-masked]>
References: <[email-masked]>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
To: Charles G Waldman <[email-masked]>
Cc: [email-masked], [email-masked]

Charles G Waldman wrote:
> 
> [email-masked] writes:
>  >
>  > int main(int argc, char *argv[])
>  > {
>  >   char pBuffer[132];
>  >
>  >   /* why does this work? */
>  >   strcpy(pBuffer,"Hello You");
>  >   strtolower(pBuffer);
>  >
>  >   /* but this gives a segmentation violation under Cygwin*/
>  >   strtolower("Hello You");
>  >
> 
> Because the string "Hello You" is a constant, and is allocated in the
> read-only segment of the executable.  The buffer pBuffer is allocated
> read/write.   This is done so that storage for literal strings can be
> shared between object files.

It's also for sharing string constants within an object file.  If you
compile the example with -fwritable-strings the constant "Hello You"
will appear twice, otherwise just once.

Modifying string constants is bad programming style and forbidden by the
C spec, I think.  I don't understand why gcc -Wall doesn't emit a
warning when assigning a string constant to a non-constant parameter. 
This code fragment will emit a warning on the 2nd call to strtolower(),
but no the first:

  int main(void) {
    const char *c = "Hello You";
    strtolower("Hello You");    /* no warning */
    strtolower(c);              /* gcc warns here */
  }

-- 
Jeff Sturm
[email-masked]
-
For help on using this list (especially unsubscribing), send a message to
"[email-masked]" with one line of text: "help".