C - 马洛克清零其他变量



我正在使用以下函数

int parse_headers(char *str, struct net_header *header)
{
    char *pch;
    struct net_header *h, *temp;
    pch = strtok(str, "n");
    header->name = pch;
    h = malloc(sizeof(struct net_header));
    header->next = h;
    while ((pch = strtok(NULL, "n")) != NULL)
    {
        h->name = pch;
        temp = malloc(sizeof(struct net_header));
        h->next = temp;
        h = temp;
    }
    return N_SUCCESS;
}

直到线路header->next = h,一切都按计划进行。但是,在行h = malloc(sizeof(struct net_header));之后,变量pchstr由于某种原因变为NULL(我设置断点来找到这个)。行temp = malloc(sizeof(struct net_header));后,header也转向NULL。显然,我有某种内存管理问题,但我似乎找不到它是什么。header参数在我调用函数之前立即初始化

header = malloc(sizeof(struct net_header));

struct net_header声明为

struct net_header
{
    char *name;
    char *content;
    struct net_header *next;
};

我运行了Xcode的静态分析器,没有发现任何问题。我也没有编译器警告或错误。我在Mac OS X 10.9上运行此程序。

为什么我的变量在我调用malloc()后被取消?

如果你需要保留strtok结果,你必须把它复制,例如strdup

int parse_headers(char *str, struct net_header *header)
{
    char *pch;
    struct net_header *h, *temp;
    pch = strtok(str, "n");
    header->name = strdup(pch);
    h = malloc(sizeof(struct net_header));
    header->next = h;
    while ((pch = strtok(NULL, "n")) != NULL)
    {
        h->name = strdup(pch);
        temp = malloc(sizeof(struct net_header));
        h->next = temp;
        h = temp;
    }
    return N_SUCCESS;
}

您需要在某处调用free以释放内存

我试图重现您的错误,在 Mac OS X 10.10 上运行,您的代码没有问题,它运行良好。

您的问题来自另一个对大小错误的malloc()调用,例如在这篇文章和这篇文章中,通常是由传递指针的大小而不是变量类型的实际大小引起的。

我无法

告诉您在哪里,因为我没有看到您的整个代码在此"糟糕的调用"之前运行,并且由于我没有足够的权限,我无法在评论中询问。

希望对您有所帮助。

相关内容

  • 没有找到相关文章