【问题标题】:How to correctly reference a double pointer inside a structure using malloc如何使用 malloc 正确引用结构内的双指针
【发布时间】:2012-07-21 11:23:42
【问题描述】:

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

提前致谢:)

【问题讨论】:

  • 几乎可以肯定,urlinfo->protocol 不是一个有效的指针。你是怎么初始化的? (顺便说一句,你永远不需要乘以 sizeof(char),因为根据定义它是 1)。
  • 我不明白你需要双指针。如果组件是单个 C 字符串(任何长度),您只需要 char*
  • 考虑到这被标记为 c++:您是否有迫切的理由使用原始指针和 malloc 进行内存管理(意味着您将其传递给需要 malloced 指针的库)?如果不是,我建议避免这样做。为什么你需要双指针?你好像没有多个协议,....

标签: c++ pointers struct malloc


【解决方案1】:

假设您真的在使用 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));

【讨论】:

  • 我的 C++ 标签是正确的,我只是习惯于使用 CStrings,因为我从中学到的一本书特别旧。不过,从现在开始,我会尝试使用 std::string 的 :) 感谢您的回答
  • 对于 C++,您需要转换 malloc 的结果,或者使用 new
【解决方案2】:

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

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

然后像这样分配它们:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 2021-08-25
    • 1970-01-01
    相关资源
    最近更新 更多