如何使用malloc正确引用结构内的双指针

时间:2012-07-21 11:23:42

标签: c++ pointers struct malloc

我编写了一个解析url并将其拆分为其组件的函数。为了存储URL的组件,我将指针(到函数)传递给以下称为urlinfo的结构:

typedef struct urlstruct {
    char** protocol;
    char** address;
    char** port;
    char** page;
} urlstruct;

它包含双指针的原因是因为我不知道URL的每个组件会有多长。在函数内部,我计算出存储每个组件所需的大小,并尝试使用以下行将内存分配给urlstruct的组件:

*(urlinfo->protocol) = (char*)malloc(i * sizeof(char));

其中(i * sizeof(char))是所需的大小。此行会导致访问冲突。有谁知道如何正确分配内存?

提前致谢:)

2 个答案:

答案 0 :(得分:6)

假设您真的使用的是C ++,那么您应该只使用:

struct urlstruct {
    std::string protocol;
    std::string address;
    std::string port;
    std::string page;
};

然后填写它变得容易:

url.protocol = "http://";

你不必担心其他任何事情。

但是,如果您的标签错误,并且您出于某种原因确实需要cstrings:

typedef struct {
    char* protocol;
    char* address;
    char* port;
    char* page;
} urlstruct;

你只需要单指针。然后,您可以以非常接近的方式为它们分配内存:

char* proto = "http://" //Assuming you get this from somewhere
int len = strlen(proto) + 1;
urlstruct url;
url.protocol = malloc(len * sizeof(char));

答案 1 :(得分:1)

您不需要指针指针。声明你的结构:

typedef struct urlstruct {
    char* protocol;
    char* address;
    char* port;
    char* page;
} urlstruct;

然后像这样分配它们:

urlinfo->protocol = (char*)malloc((i+1) * sizeof(char));

你指针指针是一个不必要的复杂功能,意味着你必须分配两个项目。您正在跳过其中一个分配,这就是您有访问冲突的原因。