Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Functions and return const char*

const char* test(bool i)
{
    const char t[] = "aa\n";
    const char* p = "bbb\n";
    if(i)
        return p;
    return t;
}
int main(array<System::String ^> ^args)
{
     printf(test(true));
     printf(test(false));
     return 0;
}

That returns something of sort:

 bbb
 %^&$^$%

It is clear that test(false) returns a pointer to a local variable. The question is that p is also local variable. Why the memory for "bbb\n" is not cleaned after the function returns. I thought const char[] is interpreted same way as const char* but it is not true as it seems.

like image 773
Nickoleta Dimitrova Avatar asked Nov 29 '25 16:11

Nickoleta Dimitrova


2 Answers

Although p is a local variable, what it points to is not local - it is a compile-time string constant; it is legal to return that constant's address from a function.

t is different, because the compile-time string constant is copied into an automatic storage area, causing an undefined behavior on dereferencing the returned pointer.

like image 87
Sergey Kalinichenko Avatar answered Dec 02 '25 07:12

Sergey Kalinichenko


p is a local variable, which you return by value, but points to a string literal, which resides in read-only memory, not in the automatic memory allocated for the method.

Returning t and the using it indeed results in undefined behavior.

Also, don't think of pointers and arrays to be equivalent.

like image 28
Luchian Grigore Avatar answered Dec 02 '25 05:12

Luchian Grigore



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!