All pastes #734198 Raw Edit

irc log

public text v1 · immutable
·published 2007-10-12 14:01 UTC
rendered paste body
[09:48:59]  < gnuvince> jamessan, jfincher: remember the char *s = "hello"; thing where you can't modify s
                        without getting a segfault because it's in a non-mutable memory space or something like
                        that?  Is that an optimisation that compilers do?
[09:52:08]  < jamessan> no, it's how your defining things. 'char *s = "hello";' creates a pointer s that has the
                        initial value of the address of the string literal "hello". string literals are stored in
                        a non-mutable section of the programs address space
[09:52:48]  < jamessan> 'char s[] = "hello";' creates an array of characters with the initial values 'h', 'e',
                        'l', 'l', 'o', '\0'.
[09:54:12]  < jfincher> gnuvince: it's a super-standard thing, afaict
[09:55:01]  < jamessan> the string literal itself is still stored in a non-mutable section of the address space,
                        but things act differently because you're defining variables of two different types
[09:55:22]  < jfincher> gnuvince: when you get around to learning assembly language, you'll see that programs
                        have segments, and some of those segments are writable, and some aren't.  When you say
                        'char *s = "hello";' the C compiler puts the literal in a non-writable segment.
[09:55:27]  < jamessan> they have similarities in how you can access them, but that's just because of how arrays
                        are implemented
[09:56:11]  < gnuvince> so if I do printf("Hello world\n");, the string in that call is stored in a non-mutable
                        section of the address space?
[09:56:20]  < jfincher> yes
[09:57:33]  < gnuvince> jamessan: when you say "things act differently", what do you mean? if char s[] = "hello";
                        stores the string in non-mutable memory, what happens when you do s[0] = 'j';?  It
                        changes places before the assigment?
[09:58:13]  < jfincher> gnuvince: char s[] = "hello" will store it in a writable segment
[09:58:20]  < jamessan> gnuvince: the string literal "hello" itself is in the non-mutable section, but the
                        assignment to s creates a copy of the string in a writable section
[09:58:51]  < gnuvince> Does this mean that char s[] = "hello" creates two instances of "hello"?
[09:59:03]  < jamessan> that's probably optimized away so there isn't anything in the non-mutable address space
[09:59:57]  < gnuvince> OK.
[10:00:05]  < gnuvince> I'll need to check my reference book tonight
[10:00:07]  < gnuvince> Thanks