Allocating space for path names (was Re: of course!)
Chip Salzenberg
chip at ateng.com
Tue Dec 12 07:08:16 AEST 1989
[ Followups to comp.lang.c, since this is a language issue. ]
According to lm at snafu.Sun.COM (Larry McVoy):
>isadir(char *path)
>{
> char *dir;
>
> dir = malloc(pathconf(path, _PC_PATH_MAX));
>
> /* etc */
>}
That's fine, if we assume a free() call at the end. However, a related
point is that repeated malloc/free calls can result in worse problems (due
to fragmentation) than a single unfreed malloc would have caused. Further,
a locally malloc'd string must be freed at every possible exit point from
the routine. Therefore, I often do something like this:
isadir(char *path)
{
static int dirsz = 0;
static char *dir = NULL;
int n;
n = strlen(path) + 10; /* or whatever */
if (dirsz < n)
{
char *p;
n += 20; /* fudge factor */
p = (dir) ? realloc(dir, n) : malloc(n);
if (!p)
die_horribly();
dirsz = n;
dir = p;
}
/* stuff */
}
The static string doesn't get repeatedly allocated and freed. And I need
not worry about freeing it before returning.
Of course, this idiom gets pretty verbose. It sometimes is worth defining a
structure containing the pointer and length, and putting the whole
malloc/realloc jazz in a common subroutine. Also, if several routines do
something similar, you might want to have them share a common buffer.
--
You may redistribute this article only to those who may freely do likewise.
Chip Salzenberg at A T Engineering; <chip at ateng.com> or <uunet!ateng!chip>
"The Usenet, in a very real sense, does not exist."
More information about the Comp.unix.wizards
mailing list