为什么释放动态创建的2D long long int数组会在c中产生SIGTRAP?

时间:2015-03-09 12:17:43

标签: c pointers exception runtime-error

我正在long long in动态创建一个简单的2D C t数组,但free数组会给SIGTRAP?我真的很困惑。int的相同代码完全正常。为什么将其与long long int一起使用会产生SIGTRAP

#include<stdio.h>
#include<stdlib.h>

int main()
{
int i,j;
int n;
scanf("%d",&n);
long long int** ptr=(long long int**)calloc(n,sizeof(long long int*));
for(i=0;i<n;i++)
ptr[i]=(long long int*)calloc(n,sizeof(long long int));

for(i=1;i<=n;i++)
for(j=i;j<=n;j++)
ptr[i-1][j-1]=i+j;

free(ptr[i]);
free(ptr);
return 0;
}

2 个答案:

答案 0 :(得分:1)

ptr中,您为nsizeof (long long int *)分配内存,但您正在循环使用for(i=0;i<50;i++)的硬编码值。

如果n少于50,则您可以通过ptr[i]来访问超出范围的内存。结果在undefined behaviour

也就是说,您应该始终检查scanf()的返回值以确保正确输入,否则,因为代码当前已写入,如果scanf()失败,您将面临UB到期使用未初始化的局部变量n

注意:您need not and do not cast返回malloc()和家人的返回值。


编辑:

这一次,问题是

  1. free(ptr[i]);内访问超出范围的内存,但重置 i值。

  2. 由于索引使用不当导致的内存泄漏。

答案 1 :(得分:0)

这是您的代码,其中包含正确的结构缩进。

int main()
{
    int i,j;
    int n;
    scanf("%d",&n);
    long long int** ptr=(long long int**)calloc(n,sizeof(long long int*));
    for(i=0;i<n;i++)
        ptr[i]=(long long int*)calloc(n,sizeof(long long int));

    for(i=1;i<=n;i++)
        for(j=i;j<=n;j++)
            ptr[i-1][j-1]=i+j;

    free(ptr[i]);
    free(ptr);
    return 0;
}

如您所见,行free(ptr[i]);仅在所有i循环退出后执行。循环在i == n + 1时退出。已为ptr分配了从0到n-1索引的n个内存块。您正在尝试释放数组末尾之后的垃圾指针。

我怀疑你真正想要的是:

for (i = 0 ; i < n ; ++i)
{
    free(ptr[i]);
}

这是一个风格问题,但我更喜欢总是把括号放在循环和条件体上,即使循环中只有一个语句。