char *
rect_to_string (Rectangle *rect)
{
char buf[256];
snprintf (buf, 256, "(%d, %d)-(%d, %d)",
rect->x, rect->y,
rect->width, rect->height);
return strdup (buf);
}
Note that memory is allocated. A client must therefore make sure to
deallocate the string when it is done with it:
char *s = rect_to_string (my_rect);
printf ("my_rect is %s\n", s);
free (s);
If you forget to free the string bad things will of course happen. You
must also not use it inline:
printf ("my_rect is %s\n", rect_to_string (my_rect));
Because that will leak memory. The memory allocated inside strdup
continues to live on, but the reference to that memory is gone.
What you can, and should do, is to use a static buffer.
char *
rect_to_string (Rectangle *rect)
{
static char buf[256];
snprintf (buf, 256, "(%d, %d)-(%d, %d)",
rect->x, rect->y,
rect->width, rect->height);
return buf;
}
Since no memory is allocated, the inline approach works ok. However,
if you want the string to survive for any longer periods of times you
must still allocate it. The following code demonstrates the bug.
char *rect1_str = rect_to_str (rect1);
char *rect2_str = rect_to_str (rect2);
printf ("The rectangles are: %s %s\n", rect1_str, rect2_str);
Both variables will point to the same static buffer. And because
rect_to_string overwrites the contents of that buffer, only the string
representation of rect2 will survive. The solution to this problem is
to explicitly allocate strings that must survive:
char *rect1_str = strdup (rect_to_str (rect1));
char *rect2_str = strdup (rect_to_str (rect2));
printf ("The rectangles are: %s %s\n", rect1_str, rect2_str);
free (rect1_str);
free (rect2_str);
Even with this quirk, I believe the last method is superior. It is
very nice to be able to just print out the contents of a struct such
as a Rectangle and not have worry about memory problems.
Inga kommentarer:
Skicka en kommentar