I just want to say Daniel you rock! Thanks for this explanation, I'm 100%
clear now :)
Melen
allanthya.org 4000
On Thu, 11 Nov 1999, Daniel A. Koepke wrote:
> On Fri, 12 Nov 1999, blah wrote:
>
> > is
> >
> > char *temp;
> >
> > the same as
> >
> > char *temp = NULL;
>
> Well, obviously, they're not the same: one sets the pointer 'temp' to
> NULL, the other doesn't. A lot of newbies have trouble with the fact that
> C does NOT initialize your variables to some sane value for you. Thus,
> "int a;" will NOT create an integer variable 'a' that is set to 0. You'll
> get some seemingly random numbers from 'a'. People set pointers to NULL
> because otherwise it's impossible to tell if they've been set to anything
> manually. Let's take some theoritical code, where we have to set a global
> struct char_data pointer named 'g_westGeneral' to a character. If the
> pointer is already set, we need to inform the previous West General that
> he has been replaced. If there's no general, we just set the new
> character:
>
> struct char_data *g_westGeneral;
>
> void
> SetWestGeneral (struct char_data *ch)
> {
> if (g_westGeneral) {
> send_to_char("You are no longer the West General!\r\n",
> g_westGeneral);
> g_westGeneral->flags &= ~CHAR_WEST_GENERAL;
> }
>
> g_westGeneral = ch;
> ch->flags |= CHAR_WEST_GENERAL;
> send_to_char("You are now the West General!\r\n", ch);
> }
>
> This code will crash the MUD. It doesn't work because we haven't set
> g_westGeneral to any value and C doesn't initialize variables for you so
> g_westGeneral is NOT NULL. That means "if (g_westGeneral)" is TRUE the
> first time we use SetWestGeneral(), even though there's no actual
> g_westGeneral. When we attempt to inform the old general, who's
> nonexistent, of his demotion, we crash. There's no useful way to test the
> validity of a pointer in this circumstance, and even if there were it
> would be so much more practical to first initialize the g_westGeneral
> pointer and never have to bother with it.
>
> Note that this is also why people set pointers back to NULL even after
> calling free() on them. free() does not change the address the pointer is
> pointing to, only the memory at that address. This means that if on a
> theoritical 16 bit computer we have a pointer to the address 0x054A, and
> call free() on it, the pointer's "value" is still 0x054A, just the memory
> at 0x054A is no longer valid. To use our above example, we could
> introduce a function like,
>
> void
> RemoveWestGeneral (void)
> {
> if (!g_westGeneral) return;
> free(g_westGeneral);
> g_westGeneral = NULL;
> }
>
> Note that without the last line in the body of the function, the next call
> to SetWestGeneral() would crash the MUD because g_westGeneral, although it
> is not NULL, is an invalid pointer (i.e., it points to memory that our
> process doesn't currently own).
>
> > or even with structs (struct char_data *me as opposed to struct char_data
> > *me = NULL).
>
> As a general rule, a pointer is a pointer, regardless of its type. All
> pointers are 4 bytes on 32 bit computers (because, of course, an address
> on a 32 bit computer is 32 bits long, or 4 bytes). Thus, the compiler
> does not treat, "char *temp = NULL;" any differently than it
> treats, "struct char_data *ch = NULL;".
>
> -dak
>
>
> +------------------------------------------------------------+
> | Ensure that you have read the CircleMUD Mailing List FAQ: |
> | http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html |
> +------------------------------------------------------------+
>
+------------------------------------------------------------+
| Ensure that you have read the CircleMUD Mailing List FAQ: |
| http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html |
+------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/15/00 PST