Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
| 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> |
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
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