This is the mail archive of the
cygwin@sourceware.cygnus.com
mailing list for the Cygwin project.
Re: BUG in function parameter passing ??????
- To: Charles G Waldman <cgw at pgt dot com>
- Subject: Re: BUG in function parameter passing ??????
- From: Jeff Sturm <jsturm at sigma6 dot com>
- Date: Fri, 28 Aug 1998 10:26:24 -0400
- CC: Mark dot Koennecke at psi dot ch, gnu-win32 at cygnus dot com
- References: <98082711213612@psicla.psi.ch> <13798.2205.894237.157257@sirius>
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".