linux-c-programming.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Antwort: Re: -EFAULT during freeing a pointer to a structure
@ 2004-10-08  9:03 p.boehm
  2004-10-08 11:31 ` Jan-Benedict Glaw
  0 siblings, 1 reply; 2+ messages in thread
From: p.boehm @ 2004-10-08  9:03 UTC (permalink / raw)
  To: Suciu Flavius; +Cc: linux-c-programming


Hi,
while allocating memory I didn't have an -EFAULT. So it couldn't be an vector limit
problem. It's while freeing! (see 'NOTE:' for special cases)

My problem-decription from mail at Sep 05:

>If I allocate memory for entry-structure with malloc() I get an -EFAULT
>    a) if I try to free the first allocated structure
>    b) if I try to free the entry-structure
>
>example output:
>
>[0] allocated.
>[1] allocated.
>...
>[7] allocated.
>[7] freed.
>[6] freed.
>...
>[1] freed.
>Segmentation Fault

>If I use otherwise '&'-operator to get the address of structure I don't get
>this error. This error is normally produced if I try to access a invalid
>memory-area or address. But here I try to free a cleanly allocated area!
>Why it is so?

I've solved that by taking an even value for MAXNUM. But I doesn't understand
why the error could happened.

NOTE: There are two errors:
     1) using &-operator for ptr there is no seg.fault
          #define MAXNUM 7
          struct abc ptt, *ptr;
          ptr=&ptt;
          [-] free(ptr);
     2) using multiple of 4 in MAXNUM there is no seg.fault
          #define MAXNUM 8
          struct abc *ptr;
          ptr=malloc(sizeof(struct abc));

Take this short example:
(it's written from mind, hope there are no spelling mistakes)
# --------------------------------------------------------- #

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXNUM 7

struct xy {
     int x;
     char *y;
};

struct abc {
     struct xy *next[MAXNUM];
};

void init_abc(struct abc *pt, int index) {
     pt->next[index]=malloc(sizeof(struct xy));
     memset(pt->next[index],0,sizeof(struct xy));
}

void free_abc(struct abc *pt, int index) {
     free(pt->next[index]);
     pt->next[index]=NULL;
}

int main(int argc, char *argv[]) {
     struct abc *ptr;
     int index=-1;

     ptr=malloc(sizeof(struct abc));
     memset(ptr, 0, sizeof((struct abc));

     while(index++<MAXNUM) {
          init_abc(ptr,index);
          printf("ptr->next[index] = %p\n", ptr->next[index]);
     }
     while(index-->0) {
          free_abc(ptr,index);
          printf("ptr->next[index] = %p\n", ptr->next[index]);
     }

     free(ptr);
     return 0;
}

# ---------------------------------------------------------------------- #

Thanks in advance.
pb


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: Antwort: Re: -EFAULT during freeing a pointer to a structure
  2004-10-08  9:03 Antwort: Re: -EFAULT during freeing a pointer to a structure p.boehm
@ 2004-10-08 11:31 ` Jan-Benedict Glaw
  0 siblings, 0 replies; 2+ messages in thread
From: Jan-Benedict Glaw @ 2004-10-08 11:31 UTC (permalink / raw)
  To: linux-c-programming

[-- Attachment #1: Type: text/plain, Size: 2604 bytes --]

On Fri, 2004-10-08 11:03:55 +0200, p.boehm@d-trust.net <p.boehm@d-trust.net>
wrote in message <OFFFC2B2B9.78606041-ONC1256F27.002EEFD1@bln.d-trust.de>:
> (it's written from mind, hope there are no spelling mistakes)

There's one, but not that bad...

> # --------------------------------------------------------- #
> 
> #include <stdio.h>
> #include <stdlib.h>
> #include <string.h>
> 
> #define MAXNUM 7
> 
> struct xy {
>      int x;
>      char *y;
> };
> 
> struct abc {
>      struct xy *next[MAXNUM];

So here you're creating an array of pointers to "struct xy". This array
has got MAXNUM elements, this is currently 7. Note that the correct
array subscripts are from 0 to 6!

> };
> 
> void init_abc(struct abc *pt, int index) {
>      pt->next[index]=malloc(sizeof(struct xy));
>      memset(pt->next[index],0,sizeof(struct xy));
> }
> 
> void free_abc(struct abc *pt, int index) {
>      free(pt->next[index]);
>      pt->next[index]=NULL;
> }
> 
> int main(int argc, char *argv[]) {
>      struct abc *ptr;
>      int index=-1;
> 
>      ptr=malloc(sizeof(struct abc));
>      memset(ptr, 0, sizeof((struct abc));

Here's a '(' too much, that's the typo.

> 
>      while(index++<MAXNUM) {
>           init_abc(ptr,index);
>           printf("ptr->next[index] = %p\n", ptr->next[index]);
>      }

...and now, think about this loop. Think hard. Got the point? It's
executed for index=0 to index=7! That's one too much! I suggest you
better write it like

	for (index = 0; index < MAXNUM; index++) {
		init_abc (ptr, index);
		printf ("ptr->next[%d] = %p\n", index, ptr->next[index]);
	}

>      while(index-->0) {
>           free_abc(ptr,index);
>           printf("ptr->next[index] = %p\n", ptr->next[index]);
>      }


And I'd write this as

	for (index = MAXNUM - 1; index >= 0; index--) {
		free_abc (ptr, index);
		printf ("ptr->next[%d] = %p\n", index, ptr->next[index]);
	}

Additionally, I've also made it print out it's index it's actually
working on. If you had done that on the first hand, you'd for sure seen
your error in no time:-)

>      free(ptr);
>      return 0;
> }
> 
> # ---------------------------------------------------------------------- #

MfG, JBG

-- 
Jan-Benedict Glaw       jbglaw@lug-owl.de    . +49-172-7608481             _ O _
"Eine Freie Meinung in  einem Freien Kopf    | Gegen Zensur | Gegen Krieg  _ _ O
 fuer einen Freien Staat voll Freier Bürger" | im Internet! |   im Irak!   O O O
ret = do_actions((curr | FREE_SPEECH) & ~(NEW_COPYRIGHT_LAW | DRM | TCPA));

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 189 bytes --]

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2004-10-08 11:31 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-10-08  9:03 Antwort: Re: -EFAULT during freeing a pointer to a structure p.boehm
2004-10-08 11:31 ` Jan-Benedict Glaw

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).