我是编程的新手,我只是不明白这一点。我应该创建一个以1d数组作为参数的函数,并释放这个数组。 我有这个:
void destroy(double A[])
{
free(A);
}
和我的主要:
void main()
{
swrmeg = (double *)malloc ((10)*sizeof(double));
swrmeg[0] = 3,2;
destroy(swrmeg);
printf("%lf\n",swrmeg[0]);
}
这应该会给出一个分段错误,但它没有,它会打印出数组的第一个双精度错误。这意味着阵列尚未被释放..任何想法为什么会发生这种情况? 有什么方法可以在函数中释放吗?
答案 0 :(得分:2)
在执行未定义的操作时无法保证Segfaults,它们有时会在执行未定义的操作时发生。
在您的案例中实际发生的事情是已在[{1}}中为您的程序分配了内存,然后您的程序已确定它在malloc
语句中不需要它;但是,操作系统决定不以这种方式移动它的内存栅栏,导致段错误。
为什么它没有这样做包括很多原因:
这就是它未定义的原因,因为它基本上依赖于所有实现不需要对齐的许多事情。 定义的部分需要对齐。
答案 1 :(得分:2)
你正确地解放了它。
做错事,比如在被释放后访问一块内存,必然意味着你会遇到分段错误,不仅仅是在道路的错误方面行驶意味着你一定会发生意外。
答案 2 :(得分:0)
您似乎被要求调查未定义的行为(UB)。 (这应该会产生分段错误)你所做的事情不能保证会出现段错误,但你可以通过写入你不拥有的地方来增加你的机会:
void main()
{
swrmeg = (double *)malloc ((10)*sizeof(double));
swrmeg[0] = 3,2;
destroy(swrmeg);
printf("%lf\n",swrmeg[0]);
}
void destroy(double *A)
{
int i;
for(i=0;i<3000;i++)//choose a looping index that will have higher likelyhood of encroaching on illegal memory
{
A[i] = i*2.0; //make assignments to places you have not allocated memory for
}
free(A);
}
关于使用免费内存: This post 是一个很好的描述为什么免费内存将有时工作。 (虽然直接处理堆栈而不是堆内存,所讨论的概念仍然是一般使用免费内存的说明)