1

我编写了一个函数来解析一个 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))所需的尺寸在哪里。此行导致访问冲突。有谁知道如何正确分配内存?

提前致谢 :)

4

2 回答 2

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));
于 2012-07-21T11:37:00.057 回答
1

您不需要指向指针的指针。像这样声明你的结构:

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

然后像这样分配它们:

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

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

于 2012-07-21T11:37:06.760 回答