From: jsturm@sigma6.com (Jeff Sturm)
Subject: Re: BUG in function parameter passing ??????
29 Aug 1998 00:58:13 -0700
Message-ID: <35E6BE10.12F2CBD9.cygnus.gnu-win32@sigma6.com>
References: <98082711213612@psicla.psi.ch>
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
To: Charles G Waldman <cgw@pgt.com>
Cc: Mark.Koennecke@psi.ch, gnu-win32@cygnus.com

Charles G Waldman wrote:
> 
> Mark.Koennecke@psi.ch 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
jsturm@sigma6.com
-
For help on using this list (especially unsubscribing), send a message to
"gnu-win32-request@cygnus.com" with one line of text: "help".
