Xref: news2.mv.net comp.os.msdos.djgpp:5737 From: lehmann AT mathematik DOT th-darmstadt DOT de (Alexander Lehmann) Newsgroups: comp.os.msdos.djgpp Subject: Re: Pointer-Allocation Date: 8 Jul 1996 16:31:46 GMT Organization: Technische Hochschule Darmstadt Lines: 69 Message-ID: <4rrd5i$1bsa@rs18.hrz.th-darmstadt.de> References: <52C767D10EA AT merlin2 DOT e-technik DOT uni-erlangen DOT de> NNTP-Posting-Host: fb0404.mathematik.th-darmstadt.de To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Michael Schuster (Schuster AT eev DOT e-technik DOT uni-erlangen DOT de) wrote: : Gruess Euch! : I've written some programs with pointers and dynamic arrays, which : might not be very exiting, but I came to a very interesting point, : when using the realloc -function of libc.a. : I defined a pointer int* p, malloc'ed and then realloc'ed some more : space.(see source below) : When using p[a]= a for initialising the pointerposition a , everything worked fine. : I've never had an error. But when using *p=a; p=p+1; : there was an error. (I did realloc the pointer before p+1 of course)- : My super C- book (C-Grundlagen, Data Becker) told that this should : cause no error. : Somehow I had the idea to run it in a DOS Box (Win3.11) and there it : works now (see source-code). My conclusion is, that this must be the : DPMI server. : My question: : Which one behaves correctely? Or is a known thing which I' ve nerver : heard of? : Michi : -------------------------------------------- : /* Dyn.c : Works fine in a DOS Box (Win 3.11) but doesnot work with native DOS : */ : #include : #include : int main(void) : { : int *p; : int a; : p=(int*) malloc(sizeof(int)); : for (a=0;a<20;a++) { : p=(int*) realloc(p,sizeof(int)*(a+1)); /* resizing p*/ : *p=a; /* init the pointer */ : printf(" Nummer: %d \t %d \n", a,*p); /* debug info */ : /* The crucial statement */ : if (!(p==NULL)) p=p+1; : : }; : } Well, the only pointers that may be passed to realloc and free are ones returned by malloc or realloc, so if you do p++, the new pointer is no longer a legal malloc pointer, in which case the behaviour is undefined. Depending on your environment, you can get protection faults or other odd things (e.g. in real mode DOS crashing after you leave the program). BTW. there is another bug in the program, you shouldn't access the contents of p before comparing the return value to NULL, but that's not the cause of the problem, I guess. bye, Alexander PS. on a sidenote, books published by Data Becker were always crap, I don't expect the C book to be an exception. If you need a good C book, use the K&R book 2nd edition, that's also available translated to German. -- Alexander Lehmann, | "On the Internet, alex AT hal DOT rhein-main DOT de (plain, MIME, NeXT) | nobody knows lehmann AT mathematik DOT th-darmstadt DOT de (plain) | you're a dog." !!CHANGED!!