SLORES@umiami.miami.edu (Stanislaw L. Olejniczak) (11/27/89)
I am trying to write a function which would, if neccessary, change the size of the string pointed to by one of the arguments, and return the pointer to the "new" string. It is part of a larger function. I seem to have a problem with realloc... I tried finding an answer in just about all the C books I have, but I simply cannot figure out WHY is it giving me problems. If you could tell me HOW to do this correctly, I would be most grateful. Any assistance would be welcome. code: ====================================================================== char *substr( char *, int, int, char **); main() { char *string="This is a test", *subs=""; int start = 3, numchar = 5; subs = substr (string, start, numchar, &subs); } char *substr (char *string, int start, int numchar, char **substr) { /*I get a variety of errors on the following statement, depending on a compiler/linker. The code bombs here, I guess because memory management is being damaged*/ *substr = (char *) realloc ( (unsigned) (numchar + 1), *substr); } ---- Stan Olejniczak Internet: slores@umiami.miami.edu University of Miami, FL USA UUCP: (temp void) gould!umbio!solejni SLORES@UMIAMI.BITNET UUCP: (?) umigw!gables!slores Voice: (305) 547-6571 FAX: (305) 548-4612 My opinions cannot possibly represent the views of anyone else!
cpcahil@virtech.uucp (Conor P. Cahill) (11/27/89)
In article <3752@umiami.miami.edu>, SLORES@umiami.miami.edu (Stanislaw L. Olejniczak) writes: > *substr = (char *) realloc ( (unsigned) (numchar + 1), *substr); First, you must RTFM. The order of arguments to realloc is: realloc(ptr,size); char * ptr; unsigned size; Second, although not explicitly stated in the manual, the pointer passed to realloc must be a ptr that was returned by a previous malloc. Your example was passing a pointer to an automatic variable. -- +-----------------------------------------------------------------------+ | Conor P. Cahill uunet!virtech!cpcahil 703-430-9247 ! | Virtual Technologies Inc., P. O. Box 876, Sterling, VA 22170 | +-----------------------------------------------------------------------+
chittamu@umvlsi.ecs.umass.edu (Satish Kumar .C) (11/27/89)
In article <3752@umiami.miami.edu> SLORES@umiami.miami.edu (Stanislaw L. Olejniczak) writes: >I am trying to write a function which would, if neccessary, change the >size of the string pointed to by one of the arguments, and return the >pointer to the "new" string. It is part of a larger function. I seem >to have a problem with realloc... I tried finding an answer in just about >all the C books I have, but I simply cannot figure out WHY is it giving me >problems. If you could tell me HOW to do this correctly, I would be most >grateful. Any assistance would be welcome. > What compiler are you using? I tried it under gcc and the Ultrix cc. It worked fine. Ofcourse I made one small change. Your last parameter to the function substr was also named substr. I changed the parameter to a different name. Could it have something to do with that? ===Code=== char *substr( char *, int, int, char **); main() { char *string="This is a test", *subs=""; int start = 3, numchar = 5; subs = substr (string, start, numchar, &subs); } char *substr (char *string, int start, int numchar, char **subs) { /* The following statement compiled fine under gcc and pcc */ *subs = ( (char *) realloc ( *subs,(unsigned) (numchar + 1))); } ========= -- -Satish. chittamu@cs.umass.edu -- The Theory of Objectivity: E = MC++
brianh@hpcvia.CV.HP.COM (brian_helterline) (11/28/89)
>I am trying to write a function which would, if neccessary, change the >size of the string pointed to by one of the arguments, and return the >pointer to the "new" string. It is part of a larger function. I seem >to have a problem with realloc... I tried finding an answer in just about >all the C books I have, but I simply cannot figure out WHY is it giving me >problems. If you could tell me HOW to do this correctly, I would be most >grateful. Any assistance would be welcome. >code: >====================================================================== >char *substr( char *, int, int, char **); >main() >{ > char *string="This is a test", > *subs=""; > int start = 3, > numchar = 5; > > subs = substr (string, start, numchar, &subs); >} > >char *substr (char *string, int start, int numchar, char **substr) >{ > /*I get a variety of errors on the following statement, depending on a > compiler/linker. The code bombs here, I guess because memory > management is being damaged*/ > > *substr = (char *) realloc ( (unsigned) (numchar + 1), *substr); ^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^ I believe you need to switch these. At least for MSC 5.1, you specify the buffer first, followed by the size. >} > > >---- >Stan Olejniczak Internet: slores@umiami.miami.edu >University of Miami, FL USA UUCP: (temp void) gould!umbio!solejni >SLORES@UMIAMI.BITNET UUCP: (?) umigw!gables!slores >Voice: (305) 547-6571 FAX: (305) 548-4612 >My opinions cannot possibly represent the views of anyone else! >----------
gwyn@smoke.BRL.MIL (Doug Gwyn) (11/28/89)
In article <3752@umiami.miami.edu> SLORES@umiami.miami.edu (Stanislaw L. Olejniczak) writes: >I seem to have a problem with realloc... You must realloc() only storage previously obtained via malloc(), calloc(), or realloc(). String literals are not among these.