Question

Hey guys I'm trying to figure how pointers are returned by strcat(), so I tried implementing my own strcat() to see how it works. The following is my code for mystrcat(), which works like the real strcat():

char *mystrcat(char *destination, char *source)
{
    char *str = destination;

    while (*str != '\0')
    {
        str++;
    }

    while (*source != '\0')
    {
        *str = *source;
        str++;
        source++;
    }
    *str = '\0';

    return str;
}

So let's say in my main(), I have

char string[BUFSIZ];
mystrcat(string, "hello");
printf("%s\n", string);

The output would be

hello

as expected. What I don't get is how returning the address of the local variable, str, would magically make the variable, string, point to it and also why is the variable, str, not deleted when the function terminates.

Was it helpful?

Solution

You're not returning the address of the local variable. You're returning the value of the local variable. Since the variable in question is a pointer, its value happens to be an address. The address that is contained in the str variable points into the memory block provided by the argument destination.

What you seem to be misunderstanding is that this:

char* str = destination;

Does not create a copy of the destination string. It creates a pointer called str that points at the same memory location that destination points to. When you use str to manipulate the characters in that memory block, the string represented by destination is also modified, because str and destination point into the exact same string of characters in memory. That's how it "magically updates" the parameter.

OTHER TIPS

str is a pointer to the string you pass in (destination), so you are modifying your original variable string from within your strcat function.

The pointer str does get deleted at the end of the routine, but it is not needed anymore.

BTW, it is confusing to use the word "string" as the name of a variable, because many languages reserve string as a keyword.

The first line of the function, you're assigning *str to be the same as *destination. In effect, when you return, you're returning *destination, which is the same as *str.

No memory is allocated, so no memory must be deleted.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top