Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.c > #24233

Re: Trying to figure out how to dynamically re-allocate strings while concatenating

Message-ID <501DC2F9.22FD@mindspring.com> (permalink)
Date 2012-08-04 20:48 -0400
From pete <pfiland@mindspring.com>
Organization PF
Newsgroups comp.lang.c
Subject Re: Trying to figure out how to dynamically re-allocate strings while concatenating
References <eb47af15-f8ff-4737-983d-3f54307c1081@googlegroups.com> <501D50E6.532@mindspring.com> <lnhasiyzqu.fsf@nuthaus.mib.org>

Show all headers | View raw


Keith Thompson wrote:
> 
> pete <pfiland@mindspring.com> writes:
> [...]
> > One thing that nobody else has mentioned, is that it is good
> > programming practice to assign the return value of realloc to a
> > temporary pointer first,
> > and only to assign that value to your working
> > pointer if the temporay pointer has been tested
> > and found to be not a null pointer.
> >
> > Otherwise you lose the value of the pointer to the allocated memory,
> > which can cause a memory leak.
> [...]
> 
> That is, of course, very good advice.
> 
> On the other hand, whether it matters depends on what you intend to do
> once you've detected an allocation failure.
> 
>     char *buf = malloc(100);
>     if (buf == NULL) {
>         /* malloc failed */
>     }
> 
>     char *temp = realloc(buf, 200);
>     if (temp == NULL) {
>         /* realloc failed */
>     }
> 
> So how can you recover from a failure to allocate memory?  You could
> just try again, but it will probably just fail again.  You could fall
> back to a less memory-intensive, but perhaps slower, algorithm, but
> I don't think I've ever seen code in the real world that does that.

I managed to write some code which does something else
in that event, but in real life 
I don't think that that part of the code will ever be used.

I have (like so many of us do) a get_line function.
It reallocates 
when the buffer isn't big enough
to hold two bytes more 
than the number of bytes
which have been read from a line in a text file.

The two bytes extra, 
is so that if reallocation fails,
then there is enough buffer to hold all of the characters
which have been read so far, 
plus space for a null byte to make a string.

The first number of bytes that I try to allocate 
is the lowest number which is 
greater than or equal to how many I need 
and which is also one less than a power of two.

If the first reallocation fails, 
then I keep using binary search to reallocate.
If the reallocation fails completely, 
then it gets difficult to describe in English.

    (min) is how much memory I need.
     (*n) is how much memory I have.
      (p) is a temporary pointer.
(lineptr) is my working pointer.

The reallocation code looks something like this:

        if (++min > *n) {
            void *p;
            size_t max;
            size_t next;

            for (next = min ^ min - 1; min > next; ++next) {
                next *= 2;
            }
            do {
                max = next;
                next = (max - min) / 2 + min;
                p = realloc(*lineptr, max);
            } while (p == NULL && max != min);
            if (p == NULL) {       
                /*
                ** Handle it.
                */         
            } else {
                *lineptr = p;
                *n = max;
            }
        }


The function is here:

http://www.mindspring.com/~pfilandr/C/lists_and_files/file_lib.c


The description of the function is here:

http://www.mindspring.com/~pfilandr/C/lists_and_files/file_lib.h



-- 
pete

Back to comp.lang.c | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

Trying to figure out how to dynamically re-allocate strings while concatenating Shriramana Sharma <jamadagni@gmail.com> - 2012-08-04 07:12 -0700
  Re: Trying to figure out how to dynamically re-allocate strings while concatenating Xavier Roche <xroche@free.fr.NOSPAM.invalid> - 2012-08-04 16:17 +0200
  Re: Trying to figure out how to dynamically re-allocate strings while concatenating Xavier Roche <xroche@free.fr.NOSPAM.invalid> - 2012-08-04 16:22 +0200
    Re: Trying to figure out how to dynamically re-allocate strings while concatenating Shriramana Sharma <jamadagni@gmail.com> - 2012-08-04 07:25 -0700
      Re: Trying to figure out how to dynamically re-allocate strings while concatenating Ben Bacarisse <ben.usenet@bsb.me.uk> - 2012-08-04 16:04 +0100
  Re: Trying to figure out how to dynamically re-allocate strings while concatenating "Heinrich Wolf" <invalid@invalid.invalid> - 2012-08-04 16:29 +0200
  Re: Trying to figure out how to dynamically re-allocate strings while concatenating Eric Sosman <esosman@ieee-dot-org.invalid> - 2012-08-04 10:52 -0400
  Re: Trying to figure out how to dynamically re-allocate strings while concatenating pete <pfiland@mindspring.com> - 2012-08-04 12:27 -0400
    Re: Trying to figure out how to dynamically re-allocate strings while concatenating Eric Sosman <esosman@ieee-dot-org.invalid> - 2012-08-04 13:56 -0400
      Re: Trying to figure out how to dynamically re-allocate strings while  concatenating pete <pfiland@mindspring.com> - 2012-08-04 17:12 -0400
  Re: Trying to figure out how to dynamically re-allocate strings while concatenating pete <pfiland@mindspring.com> - 2012-08-04 12:42 -0400
    Re: Trying to figure out how to dynamically re-allocate strings while concatenating Eric Sosman <esosman@ieee-dot-org.invalid> - 2012-08-04 14:00 -0400
    Re: Trying to figure out how to dynamically re-allocate strings while concatenating Keith Thompson <kst-u@mib.org> - 2012-08-04 17:00 -0700
      Re: Trying to figure out how to dynamically re-allocate strings while concatenating pete <pfiland@mindspring.com> - 2012-08-04 20:48 -0400
      Re: Trying to figure out how to dynamically re-allocate strings while concatenating Jens Gustedt <jens.gustedt@loria.fr> - 2012-08-05 09:22 +0200
        Re: Trying to figure out how to dynamically re-allocate strings while concatenating Ben Bacarisse <ben.usenet@bsb.me.uk> - 2012-08-05 12:49 +0100
          Re: Trying to figure out how to dynamically re-allocate strings while concatenating Jens Gustedt <jens.gustedt@loria.fr> - 2012-08-05 17:12 +0200
          Re: Trying to figure out how to dynamically re-allocate strings while concatenating Keith Thompson <kst-u@mib.org> - 2012-08-05 13:17 -0700
            Re: Trying to figure out how to dynamically re-allocate strings while concatenating Ben Bacarisse <ben.usenet@bsb.me.uk> - 2012-08-05 22:53 +0100
  Re: Trying to figure out how to dynamically re-allocate strings while concatenating Shriramana Sharma <jamadagni@gmail.com> - 2012-08-04 19:20 -0700
  Re: C Vs Asm i use for cat function "io_x" <a@b.c.invalid> - 2012-08-05 08:15 +0200
    Re: C Vs Asm i use for cat function "BartC" <bc@freeuk.com> - 2012-08-05 10:22 +0100
      Re: C Vs Asm i use for cat function "Heinrich Wolf" <invalid@invalid.invalid> - 2012-08-05 17:00 +0200
        Re: C Vs Asm i use for cat function Ben Bacarisse <ben.usenet@bsb.me.uk> - 2012-08-05 16:20 +0100
      Re: C Vs Asm i use for cat function "io_x" <a@b.c.invalid> - 2012-08-05 19:51 +0200
        Re: C Vs Asm i use for cat function "BartC" <bc@freeuk.com> - 2012-08-05 21:04 +0100
  Re: Trying to figure out how to dynamically re-allocate strings while concatenating Phil Carmody <thefatphil_demunged@yahoo.co.uk> - 2012-08-10 10:45 +0300

csiph-web