Path: utzoo!utgpu!news-server.csri.toronto.edu!rpi!zaphod.mps.ohio-state.edu!wuarchive!udel!brahms.udel.edu!weave From: weave@brahms.udel.edu (Ken Weaverling) Newsgroups: comp.lang.c Subject: Returning pointers to constant strings Keywords: static constant string Message-ID: <21139@brahms.udel.edu> Date: 6 May 91 15:02:46 GMT Distribution: na Organization: University of Delaware Lines: 51 I have scanned the FAQs and have also discussed this topic in a local group, but would now like to get a few more opinions. Question: Is there anything dangerous with returning pointers to literal strings? Is there a portability issue to consider? Is it just bad practice? Sample code: char *phredd () { char *phrogg; phrogg = "Phredd Phrogg's Phantasy Philm"; return phrogg; } *Solutions* to this are many, such as returning a pointer to a static char array, making the literal a global, strdup()'ing it, or strcpy()'ing it to another place. I am concerned with the mentioned issue though. In the local newsgroup at Univ of Del, the consensus was that it would be a bad idea, due to systems such as Mess/DOS that might use code overlays, and the constant string might be stored in a code overlay that would not always be resident. I used gdb against a gcc compiled source to verify that the string was stored in the code segment just after a function (but not necessarily the same function that it is used in). I know that it is not a good idea to alter the string, but that also is not the issue. Well, I referred to the *bible* for C, the Kernighan and Ritchie book on C, second edition (for ANSI C). It says on page 194, section A2.6 ... A string literal, also called a string constant, is a sequence of characters surrounded by double quotes, as in "...". A string has type "array of characters" and storage class *static*. Whether identical strings are distinct is implementation-defined, and the behavior of a program that attempts to alter a string literal is undefined. .... and then the definition of static from section A4.1 ... Static objects may be local to a block or external to all blocks, but in either case, retain their values across exit from and reentry to functions and blocks. So, from above, I infer that there is nothing wrong with the code above. Any comments? Is it still bad practice from a style standpoint? Thanks! -- >>>---> Ken Weaverling >>>----> weave@brahms.udel.edu