c++cmallocconst-charconst-pointer

Dynamically allocating memory for const char string using malloc()


I am writing a program that reads a value from an .ini file, then passes the value into a function that accepts a PCSTR (i.e. const char *). The function is getaddrinfo().

So, I want to write PCSTR ReadFromIni(). To return a constant string, I plan on allocating memory using malloc() and casting the memory to a constant string. I will be able to get the exact number of characters that were read from the .ini file.

Is that technique okay? I don't really know what else to do.

The following example runs fine in Visual Studio 2013, and prints out "hello" as desired.

const char * m()
{
    char * c = (char *)malloc(6 * sizeof(char));
    c = "hello";
    return (const char *)c;
}    

int main(int argc, char * argv[])
{
    const char * d = m();
    std::cout << d; // use PCSTR
}

Solution

  • The second line is "horribly" wrong:

    char* c = (char*)malloc(6*sizeof(char));
    // 'c' is set to point to a piece of allocated memory (typically located in the heap)
    c = "hello";
    // 'c' is set to point to a constant string (typically located in the code-section or in the data-section)
    

    You are assigning variable c twice, so obviously, the first assignment has no meaning. It's like writing:

    int i = 5;
    i = 6;
    

    On top of that, you "lose" the address of the allocated memory, so you will not be able to release it later.

    You can change this function as follows:

    char* m()
    {
        const char* s = "hello";
        char* c = (char*)malloc(strlen(s)+1);
        strcpy(c,s);
        return c;
    }
    

    Keep in mind that whoever calls char* p = m(), will also have to call free(p) at some later point...