我正在编写一个从.ini文件读取值的程序,然后将该值传递给接受PCSTR的函数(即const char *)。该函数是getaddrinfo()
。
所以,我想写PCSTR ReadFromIni()
。要返回一个常量字符串,我计划使用malloc()
分配内存并将内存转换为常量字符串。我将能够获得从.ini文件中读取的确切字符数。
这种技术还好吗?我真的不知道还能做什么。
以下示例在Visual Studio 2013中正常运行,并根据需要打印出“hello”。
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
}
答案 0 :(得分:7)
第二行“可怕”错误:
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)
您要分配变量c
两次,所以很明显,第一个赋值没有任何意义。
这就像写作:
int i = 5;
i = 6;
除此之外,你“丢失”了已分配内存的地址,因此以后你将无法释放它。
您可以按如下方式更改此功能:
char* m()
{
const char* s = "hello";
char* c = (char*)malloc(strlen(s)+1);
strcpy(c,s);
return c;
}
请注意,无论是谁调用char* p = m()
,都必须稍后致电free(p)
......
答案 1 :(得分:2)
一种方法是返回本地静态指针。
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;
}
这样,每当下次调用m()
时,c
仍指向先前分配的内存块。您可以按需重新分配内存,填写新内容并返回地址。
答案 2 :(得分:1)
NO。这不行。当你这样做
c = "hello";
由malloc
分配的内存丢失
你可以这样做
const char * m()
{
char * c = (char *)malloc(6 * sizeof(char));
fgets(c, 6, stdin);
return (const char *)c;
}