当我将列表的开头传递给free()
内存的函数时。我得到的错误如下:
"HEAD CORRUPTION DETECTED: after Normal block (#70) at 0x011BCC0
CRT detected that the application wrote to memory after end of head buffer. "
我尝试仅free()
仅查看第一个节点,以了解其运行方式,但存在相同的错误。
我还尝试在main中使用free()
,而不是将head
传递给函数,但是我必须在函数中执行。
void freeListOfEmployees(EmployeeNode *head)
{
EmployeeNode *ptr = head, *temp = NULL;
while (ptr != NULL) {
temp = ptr;
ptr = ptr->next;
free(temp);
}
head = NULL;
}
答案 0 :(得分:1)
问题不在import numpy as np
from scipy.stats import norm
n = 10000
observations = np.random.uniform(low=5, high=7, size=n)
groups = np.random.randint(low=1, high=10, size=n)
data = np.array([groups, observations]).T
df = np.array([norm.fit(data[data[:,0]==i,1]) for i in np.unique(data[:,0])])
mu = df[:, 0]
std = df[:, 1]
print(mu, std)
# [6.00968012 5.97677677 5.99516999 5.99329037 6.01787526 5.98163756 6.01775866 6.01331319 5.97938708]
# [0.57232071 0.57108535 0.57457272 0.569295 0.57263456 0.58611009 0.57446768 0.58279465 0.5719683 ]
中,而在freeListOfEmployees
中,更具体地说是在此行中:
createEmployeeNode
您正在为EmployeeNode *temp = (EmployeeNode *)malloc(sizeof(EmployeeData));
^^^^^^ ^^^^^^
分配内存,但您要求的是EmployeeNode
的大小。
这是正确的:
EmployeeData
或更好:
EmployeeNode *temp = (EmployeeNode *)malloc(sizeof(EmployeeNode));
甚至更好:
EmployeeNode *temp = (EmployeeNode *)malloc(sizeof *temp);
这样,就不可能弄错尺寸。
强制转换EmployeeNode *temp = malloc(sizeof *temp);
并非完全错误,但没有用。
并预料到您的下一个问题:为什么问题仅在(EmployeeNode*)
而不是之前发生?
答案:因为您正在覆盖不属于您的内存,从而触发了所谓的“未定义的行为”,一旦触发了未定义的行为,任何事情都会发生。未定义的行为包括“显然要罚款”。