Re: problem with malloc/realloc. Pls help.
Thanks a lot, Igor Mark. i was able to rectify the code to fix the problem. Now it works. (i had to use a pointer to a pointer to int, rather than just a pointer to int in the subroutine) thanks again. o. --- Igor Peshansky [EMAIL PROTECTED] wrote: On Mon, 21 Aug 2006, Omololu wrote: Hi, i have the following code. it compiles with gcc in Cygwin but the contents of the array ifitQ that I get after the call to the subroutine readCharges2 is gibberish. This is expected behavior. Read on. The code compiles with gcc under Linux and it runs correctly. it also compiles and runs correctly with windows visual studio. Pls help. The resuls i get with Cygwin is: isumNatms = 5 rrr 13 rrr 14 rrr 15 rrr 16 *** 1628693268 *** 1628693268 *** 16 *** 1034 instead of: isumNatms = 5 rrr 13 rrr 14 rrr 15 rrr 16 *** 13 *** 14 *** 15 *** 16 the code is: Ouch. Indentation issues aside, you have a bug in this program. #include stdio.h #include stdlib.h void readCharges2(int *, int *, int *); int main() { static int *ifitQ; int *ipUniqAtms, *ipindexToFit; int j; int x,y; ipUniqAtms =x; ipindexToFit=y; ifitQ = (int *) malloc(sizeof(int)); if(ifitQ==NULL){printf(Unable to allocate matrix ifitQ\n); exit(EXIT_FAILURE);} readCharges2(ifitQ,ipUniqAtms,ipindexToFit); Note that ifitQ is passed *by value*, and any changes you make to it inside readCharges2() will be lost when you come back to main. So, you realloc it inside readCharges2(), and store values in the new array, but in main(), you print the values in the *old* array (which are, as you said, gibberish, as the memory has been released to the system). for(j=0; j *ipUniqAtms ; j++) { printf(*** %d\n,ifitQ[j]); } return 0; } void readCharges2(int *ifitQ, int * ipUniqAtms, int * ipindexToFit) { int j, isumNatms=0; isumNatms=5; printf(isumNatms = %d \n,isumNatms); ifitQ = (int *) realloc(ifitQ,isumNatms*sizeof(int)); if(ifitQ==NULL){printf(Unable to allocate matrix ifitQ\n); exit(EXIT_FAILURE);} ifitQ[0]=13; ifitQ[1]=14; ifitQ[2]=15; ifitQ[3]=16; *ipUniqAtms = 4; *ipindexToFit = 3; for(j=0; j *ipUniqAtms ; j++) { printf(rrr %d\n,ifitQ[j]); } } The reason it probably worked on Linux is because in Linux, realloc will try hard to keep the array at the same address if it can simply bump the size of the pointer. Cygwin's realloc doesn't. HTH, Igor -- http://cs.nyu.edu/~pechtcha/ |\ _,,,---,,_ [EMAIL PROTECTED] | [EMAIL PROTECTED] ZZZzz /,`.-'`'-. ;-;;,_ Igor Peshansky, Ph.D. (name changed!) |,4- ) )-,_. ,\ ( `'-' old name: Igor Pechtchanski '---''(_/--' `-'\_) fL a.k.a JaguaR-R-R-r-r-r-.-.-. Meow! Las! je suis sot... -Mais non, tu ne l'es pas, puisque tu t'en rends compte. But no -- you are no fool; you call yourself a fool, there's proof enough in that! -- Rostand, Cyrano de Bergerac * SEEK GOD! *** -- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Problem reports: http://cygwin.com/problems.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/
Re: problem with malloc/realloc. Pls help.
On Mon, 21 Aug 2006, Omololu wrote: Hi, i have the following code. it compiles with gcc in Cygwin but the contents of the array ifitQ that I get after the call to the subroutine readCharges2 is gibberish. This is expected behavior. Read on. The code compiles with gcc under Linux and it runs correctly. it also compiles and runs correctly with windows visual studio. Pls help. The resuls i get with Cygwin is: isumNatms = 5 rrr 13 rrr 14 rrr 15 rrr 16 *** 1628693268 *** 1628693268 *** 16 *** 1034 instead of: isumNatms = 5 rrr 13 rrr 14 rrr 15 rrr 16 *** 13 *** 14 *** 15 *** 16 the code is: Ouch. Indentation issues aside, you have a bug in this program. #include stdio.h #include stdlib.h void readCharges2(int *, int *, int *); int main() { static int *ifitQ; int *ipUniqAtms, *ipindexToFit; int j; int x,y; ipUniqAtms =x; ipindexToFit=y; ifitQ = (int *) malloc(sizeof(int)); if(ifitQ==NULL){printf(Unable to allocate matrix ifitQ\n); exit(EXIT_FAILURE);} readCharges2(ifitQ,ipUniqAtms,ipindexToFit); Note that ifitQ is passed *by value*, and any changes you make to it inside readCharges2() will be lost when you come back to main. So, you realloc it inside readCharges2(), and store values in the new array, but in main(), you print the values in the *old* array (which are, as you said, gibberish, as the memory has been released to the system). for(j=0; j *ipUniqAtms ; j++) { printf(*** %d\n,ifitQ[j]); } return 0; } void readCharges2(int *ifitQ, int * ipUniqAtms, int * ipindexToFit) { int j, isumNatms=0; isumNatms=5; printf(isumNatms = %d \n,isumNatms); ifitQ = (int *) realloc(ifitQ,isumNatms*sizeof(int)); if(ifitQ==NULL){printf(Unable to allocate matrix ifitQ\n); exit(EXIT_FAILURE);} ifitQ[0]=13; ifitQ[1]=14; ifitQ[2]=15; ifitQ[3]=16; *ipUniqAtms = 4; *ipindexToFit = 3; for(j=0; j *ipUniqAtms ; j++) { printf(rrr %d\n,ifitQ[j]); } } The reason it probably worked on Linux is because in Linux, realloc will try hard to keep the array at the same address if it can simply bump the size of the pointer. Cygwin's realloc doesn't. HTH, Igor -- http://cs.nyu.edu/~pechtcha/ |\ _,,,---,,_[EMAIL PROTECTED] | [EMAIL PROTECTED] ZZZzz /,`.-'`'-. ;-;;,_Igor Peshansky, Ph.D. (name changed!) |,4- ) )-,_. ,\ ( `'-' old name: Igor Pechtchanski '---''(_/--' `-'\_) fL a.k.a JaguaR-R-R-r-r-r-.-.-. Meow! Las! je suis sot... -Mais non, tu ne l'es pas, puisque tu t'en rends compte. But no -- you are no fool; you call yourself a fool, there's proof enough in that! -- Rostand, Cyrano de Bergerac -- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Problem reports: http://cygwin.com/problems.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/
Re: problem with malloc/realloc. Pls help.
On Mon, 21 Aug 2006, Igor Peshansky wrote: On Mon, 21 Aug 2006, Omololu wrote: Hi, i have the following code. it compiles with gcc in Cygwin but the contents of the array ifitQ that I get after the call to the subroutine readCharges2 is gibberish. This is expected behavior. Read on. The code compiles with gcc under Linux and it runs correctly. it also compiles and runs correctly with windows visual studio. Pls help. The resuls i get with Cygwin is: isumNatms = 5 rrr 13 rrr 14 rrr 15 rrr 16 *** 1628693268 *** 1628693268 *** 16 *** 1034 instead of: isumNatms = 5 rrr 13 rrr 14 rrr 15 rrr 16 *** 13 *** 14 *** 15 *** 16 the code is: Ouch. Indentation issues aside, you have a bug in this program. #include stdio.h #include stdlib.h void readCharges2(int *, int *, int *); int main() { static int *ifitQ; int *ipUniqAtms, *ipindexToFit; int j; int x,y; ipUniqAtms =x; ipindexToFit=y; ifitQ = (int *) malloc(sizeof(int)); if(ifitQ==NULL){printf(Unable to allocate matrix ifitQ\n); exit(EXIT_FAILURE);} readCharges2(ifitQ,ipUniqAtms,ipindexToFit); Note that ifitQ is passed *by value*, and any changes you make to it inside readCharges2() will be lost when you come back to main. So, you realloc it inside readCharges2(), and store values in the new array, but in main(), you print the values in the *old* array (which are, as you said, gibberish, as the memory has been released to the system). for(j=0; j *ipUniqAtms ; j++) { printf(*** %d\n,ifitQ[j]); } return 0; } void readCharges2(int *ifitQ, int * ipUniqAtms, int * ipindexToFit) { int j, isumNatms=0; isumNatms=5; printf(isumNatms = %d \n,isumNatms); ifitQ = (int *) realloc(ifitQ,isumNatms*sizeof(int)); if(ifitQ==NULL){printf(Unable to allocate matrix ifitQ\n); exit(EXIT_FAILURE);} ifitQ[0]=13; ifitQ[1]=14; ifitQ[2]=15; ifitQ[3]=16; *ipUniqAtms = 4; *ipindexToFit = 3; for(j=0; j *ipUniqAtms ; j++) { printf(rrr %d\n,ifitQ[j]); } } The reason it probably worked on Linux is because in Linux, realloc will try hard to keep the array at the same address if it can simply bump the size of the pointer. Cygwin's realloc doesn't. s/pointer/memory block/. Sorry for the typo. Igor -- http://cs.nyu.edu/~pechtcha/ |\ _,,,---,,_[EMAIL PROTECTED] | [EMAIL PROTECTED] ZZZzz /,`.-'`'-. ;-;;,_Igor Peshansky, Ph.D. (name changed!) |,4- ) )-,_. ,\ ( `'-' old name: Igor Pechtchanski '---''(_/--' `-'\_) fL a.k.a JaguaR-R-R-r-r-r-.-.-. Meow! Las! je suis sot... -Mais non, tu ne l'es pas, puisque tu t'en rends compte. But no -- you are no fool; you call yourself a fool, there's proof enough in that! -- Rostand, Cyrano de Bergerac -- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Problem reports: http://cygwin.com/problems.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/
Re: problem with malloc/realloc. Pls help.
On 8/21/06, Omololu wrote: Hi, i have the following code. it compiles with gcc in Cygwin but the contents of the array ifitQ that I get after the call to the subroutine readCharges2 is gibberish. looks like a passing by reference problem. if you add debug to look at the address of ifitQ at all stages, you'll notice that the copy pointer in readCharges2 gets changed, but that isn't the same pointer as in the calling block. see section 2.17 of http://www.lysator.liu.se/c/c-faq/c-2.html i don't understand how linux is getting it right tbh. -- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Problem reports: http://cygwin.com/problems.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/