我正在使用以下函数
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));
之后,变量pch
和str
由于某种原因变为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()
调用,例如在这篇文章和这篇文章中,通常是由传递指针的大小而不是变量类型的实际大小引起的。
告诉您在哪里,因为我没有看到您的整个代码在此"糟糕的调用"之前运行,并且由于我没有足够的权限,我无法在评论中询问。
希望对您有所帮助。