4

我正在编写一个程序,它从 .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
}
4

3 回答 3

8

第二行是“可怕的”错误:

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)在稍后的某个时间打电话...

于 2014-02-05T14:37:59.453 回答
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仍然指向之前分配的内存块。您可以按需重新分配内存,填写新内容并返回地址。

于 2014-02-05T14:27:30.253 回答
1

不。这不行。当你这样做

c = "hello";  

malloclost分配的内存。
你可以这样做

const char * m()
{
    char * c = (char *)malloc(6 * sizeof(char));
    fgets(c, 6, stdin);
    return (const char *)c;
}    
于 2014-02-05T14:22:45.680 回答