【问题标题】:malloc nulling other variablesmalloc 清零其他变量
【发布时间】:2015-04-14 19:08:08
【问题描述】:

我正在使用以下功能

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() 后我的变量无效?

【问题讨论】:

  • *str 是变成 NULL 还是 str 本身? str 是堆栈或寄存器中指针的副本,即使在某些内存管理问题的情况下,也不应该受到对 malloc 的调用的影响。这同样适用于 pch。
  • 如果header 为NULL,header->next = h; 将是一个问题。你有多确定header 不为NULL?
  • @Meixner 在malloc 之前,它包含一个字符串("foo"),但在调用之后它是NULL,所以我会说str 本身。
  • @RSahu 当我在 while 循环之前的任何位置设置断点时,header 指向一个有效对象,并且它的 name 值设置正确。
  • 尝试使用除malloc() 之外的任何其他函数调用分配给 h。如果你得到类似的行为(变量任意改变),你就会遭受堆栈损坏。

标签: c malloc


【解决方案1】:

如果您需要保留 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 来释放内存

【讨论】:

  • 欲了解更多信息,请参阅此处:stackoverflow.com/questions/7100214/strtok-segfault
  • 这很有帮助,但我仍然有归零问题。
  • 这只是在str 可能被更改并且您希望header->name 独立于str 的情况下。到目前为止,这与他的问题无关。
【解决方案2】:

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

您的问题来自另一个对 malloc() 的调用,其大小不正确,例如 postthis one,通常是由传递指针的大小而不是变量类型的实际大小引起的。

我不能告诉你在哪里,因为我没有看到你的整个代码在这个“坏调用”之前运行,我不能在 cmets 中询问,因为我没有足够的权限。

希望对你有帮助。

【讨论】:

  • 我回家后会调查此事,如果有任何发现会通知您。
  • 关于您的问题的任何消息?你成功修复了吗?
猜你喜欢
  • 2010-12-09
  • 2023-03-30
  • 1970-01-01
  • 2012-09-08
  • 1970-01-01
  • 1970-01-01
  • 2014-02-06
  • 2013-01-29
  • 1970-01-01
相关资源
最近更新 更多