我正在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;
}
答案 0 :(得分:1)
在ptr
中,您为n
次sizeof (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()
和家人的返回值。
编辑:
这一次,问题是
在free(ptr[i]);
内访问超出范围的内存,但重置 i
值。
由于索引使用不当导致的内存泄漏。
答案 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]);
}
这是一个风格问题,但我更喜欢总是把括号放在循环和条件体上,即使循环中只有一个语句。