问题
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
}
回答1:
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...
回答2:
One way is to return a local static pointer.
const char * m()
{
static char * c = NULL;
free(c);
c = malloc(6 * sizeof(char));
strcpy(c, "hello"); /* or fill in c by any other way */
return c;
}
This way, whenever the next time m()
is called, c
still points to the memory block allocated earlier. You could reallocate the memory on demand, fill in new content, and return the address.
回答3:
NO. This is not OK. When you do
c = "hello";
the memory allocated by malloc
lost.
You can do as
const char * m()
{
char * c = (char *)malloc(6 * sizeof(char));
fgets(c, 6, stdin);
return (const char *)c;
}
来源:https://stackoverflow.com/questions/21579819/dynamically-allocating-memory-for-const-char-string-using-malloc