Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
| From | Keith Thompson <kst-u@mib.org> |
|---|---|
| Newsgroups | comp.lang.c |
| Subject | Re: string literals vs char* |
| Date | 2014-12-27 11:55 -0800 |
| Organization | None to speak of |
| Message-ID | <lnbnmozx3e.fsf@nuthaus.mib.org> (permalink) |
| References | <549e45b4$0$280$14726298@news.sunsite.dk> <ptss9a9fsoeqb304o4vmhht9qffb2414dg@4ax.com> |
Barry Schwarz <schwarzb@dqel.com> writes:
> On 27 Dec 2014 05:37:56 GMT, arnuld <sunrise@invalid.address> wrote:
>>C90 requires that string literls are constant, then why I am not getting
>>warning here. Is this a compiler problem ? (if it is a compiler problem
>
> There is a difference between constant and const. String literals
> have always been considered constant (modifying one causes undefined
> behavior). However, for historical reasons (not breaking really old
> code) they are not const. Hence no diagnostic. You are however free
> to define the pointer properly as
> const char *p1;
> which would have no effect on the operation of your program.
All this applies to C90, C99, and C11.
Yes, there's a difference between constant and const, but you haven't
stated it correctly.
A *constant expression* is one that can be (and in some cases must be)
evaluated at compile time. (And a "constant", used as a noun, is a
token in source code, referred to in some languages as a "literal".)
The "const" keyword, on the other hand, means read-only.
String literals are read-only, but as you say they're not made "const"
for historical reasons. Attempting to modifying a string literal has
undefined beahvior, but you can't count on the compiler to diagnose the
attempt.
Some pre-ANSI C compilers, IIRC, actually allowed you to modify string
literals, so that this:
char *s = "hello";
s[0] = 'H';
puts(s);
would actually print "Hello". (It might also affect other uses of the
same string literal.) And in fact a conforming C11 compiler could do
the same thing; the behavior is undefined, so it can do anything it
likes.
>>then why g++ catches the error at compile time when gcc does not):
Because g++ is a C++ compiler, and in C++ string literals are const.
> I don't use g++ but based on the text of the diagnostic, it appears
> that g++ treats the literals as const due to the specified option
> being in effect. If you compiled the program without that option, I
> would expect the diagnostic to disappear.
>
>>[arnuld@arch64 c $] cat test.c
>>#include<stdio.h>
>>
>>int main(void)
>>{
>> char *p1 = "India", *p2;
>> p2=p1;
>> p1 = "BIX";
>> printf("%s %s\n", p1, p2);
>> return 0;
>>}
>>
>>================== OUTPUT =======================
>>[arnuld@arch64 c $] gcc -ansi -pedantic -Wall -Wextra test.c
>>[arnuld@arch64 c $] ./a.out
>>BIX India
>>
>>[arnuld@arch64 c $] g++ -ansi -pedantic -Wall -Wextra test.c
>>test.c: In function ‘int main()’:
>>test.c:5:16: warning: deprecated conversion from string constant to
>>‘char*’ [-Wwrite-strings]
>> char *p1 = "India", *p2;
>> ^
>>test.c:7:8: warning: deprecated conversion from string constant to
>>‘char*’ [-Wwrite-strings]
>> p1 = "BIX";
>> ^
>>[arnuld@arch64 c $]
--
Keith Thompson (The_Other_Keith) kst-u@mib.org <http://www.ghoti.net/~kst>
Working, but not speaking, for JetHead Development, Inc.
"We must do something. This is something. Therefore, we must do this."
-- Antony Jay and Jonathan Lynn, "Yes Minister"
Back to comp.lang.c | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
string literals vs char* arnuld <sunrise@invalid.address> - 2014-12-27 05:37 +0000
Re: string literals vs char* Kaz Kylheku <kaz@kylheku.com> - 2014-12-27 06:36 +0000
Re: string literals vs char* Barry Schwarz <schwarzb@dqel.com> - 2014-12-27 00:58 -0800
Re: string literals vs char* Ian Collins <ian-news@hotmail.com> - 2014-12-27 22:03 +1300
Re: string literals vs char* Keith Thompson <kst-u@mib.org> - 2014-12-27 11:55 -0800
Re: string literals vs char* glen herrmannsfeldt <gah@ugcs.caltech.edu> - 2014-12-28 07:55 +0000
Re: string literals vs char* Ben Bacarisse <ben.usenet@bsb.me.uk> - 2014-12-28 11:39 +0000
Re: string literals vs char* Tim Rentsch <txr@alumni.caltech.edu> - 2015-03-24 08:55 -0700
Re: string literals vs char* Keith Thompson <kst-u@mib.org> - 2015-03-24 12:17 -0700
Re: string literals vs char* James Kuyper <jameskuyper@verizon.net> - 2014-12-27 11:36 -0500
Re: string literals vs char* Vincenzo Mercuri <nomail@yahoo.it> - 2014-12-27 18:20 +0100
Re: string literals vs char* Vincenzo Mercuri <nomail@yahoo.it> - 2014-12-27 18:55 +0100
Re: string literals vs char* Kaz Kylheku <kaz@kylheku.com> - 2014-12-27 17:25 +0000
Re: string literals vs char* Keith Thompson <kst-u@mib.org> - 2014-12-27 12:08 -0800
Re: string literals vs char* James Kuyper <jameskuyper@verizon.net> - 2014-12-28 07:01 -0500
Re: string literals vs char* John Bode <jfbode1029@gmail.com> - 2014-12-30 10:52 -0800
csiph-web