【发布时间】:2015-07-20 11:55:30
【问题描述】:
int listLength(struct node *r) {
int *len = (int *)malloc(sizeof(int));
if(!r) {
free(len);
return *len;
}
while(r) {
r = r->next;
*len += 1;
}
free(len)
return *len;
}
我写了这个函数来计算链表的长度。我仍然通过和他们一起玩来学习指针。我知道我可以在函数中使用一个简单的 len 变量,但我想学习动态内存分配的基础知识。为什么即使列表中的元素很少,长度也总是为 0?什么时候应该调用free()?
【问题讨论】:
-
你不能释放内存然后使用它。您可以将它存储在一个临时变量中,免费使用,然后返回它。
int t = *len; free(len); return t; -
1)。你没有用 0 初始化 len。2)你访问了 free'ed 内存。
-
在这个函数中没有任何理由动态分配根本。只需声明一个本地
int len = 0;累积您的计数,然后return len; -
在
free(len)之前,您需要将len指向的值存储在其他变量中。例如:int len2 = *len。这基本上消除了len动态分配的全部要点,您也可以静态分配它(即int len)。通常,当所需的内存量仅在运行时已知时,您需要使用动态内存分配。在给定的示例中,所需的内存量 -sizeof(int)- 在运行时之前是众所周知的(恒定且固定)。 -
另外,您应该在访问内存之前检查 malloc 返回的值。 'if (!len) return -1;'
标签: c pointers memory-management malloc free