From: moskewcz AT Princeton DOT EDU (Matthew Moskewicz) Subject: OT: Re: BUG in function parameter passing ?????? 28 Aug 1998 12:08:07 -0700 Message-ID: <35E62FFA.3A3041E6.cygnus.gnu-win32@Princeton.edu> References: <98082711213612 AT psicla DOT psi DOT ch> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit To: Mark DOT Koennecke AT psi DOT ch Cc: gnu-win32 AT cygnus DOT com I know this isn't helpfull, but I'm fresh out of Sedgewick's algorithms class (CS226) and I can't resist pointing out that your strtolower function is quadratic, since it calls strlen on every iteration ... I'll post a corrected version, which I'm (almost) sure someone else will strike down ... As to your problem, I don't know the specific answer, but your code relies on the fact that the compiler puts the string "Hello You" somewhere writeable. This may be a "reasonable" assumption, but you still shouldn't make it. As you have found, the complier is not always "reasonable" from one's point of view. From my (albeit only 7 years or so) of experience, what you've done just looks fishy -- ie. it relies on compiler behavior that's in (serious) doubt. Others can quote the actual specs if they wish ... but from what I remember, such strings are *supposed* to be read only. Take a look at these results, from a SunOS box: [begin test] yuma:~/scratch> cc temp.c yuma:~/scratch> a.out Success yuma:~/scratch> gcc temp.c yuma:~/scratch> a.out Segmentation Fault (core dumped) yuma:~/scratch> A snippet from the assembly shows (persumably) that "Hello You" is in a read only section under gcc; i didn't look, but it's probably in bss or common or something with cc. Whatever ... live with it. ..section ".rodata" .align 8 ..LLC3: .asciz "Hello You" .align 8 ..LLC4: .asciz "Success\n" ..section ".text" Mark DOT Koennecke AT psi DOT ch wrote: > > void strtolower(char *pText) > { [snip] // i gets strlen(pText) after we assert(pText) int i = ( assert(pText) , strlen(pText) ); while( i-- ) // iteratre over string *pText = tolower(*pText++); // flip each char to lowercase } [resume] > /*---------------------------------------------------------------------*/ > > 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"); > > printf("Success\n"); > > } > - > For help on using this list (especially unsubscribing), send a message to > "gnu-win32-request AT cygnus DOT com" with one line of text: "help". -- Matthew Moskewicz | mailto:moskewcz AT Princeton DOT edu 234 Lockhart | http://www.princeton.edu/~moskewcz Princeton, NJ 08544 | (609)258-UNKN (till september) - For help on using this list (especially unsubscribing), send a message to "gnu-win32-request AT cygnus DOT com" with one line of text: "help".