首先看看我的代码。它在在线判断中给出了运行时错误(sigsegov),尽管在我的计算机上运行得很好。请帮我找出错误。
限制条件是:
0<t1<1000000
0<num<100000000
#include<stdio.h>
#include<malloc.h>
int *a;
int main()
{
a = malloc(sizeof(int)*100000000);
int t=3,j,k1,k=1,n=0,i,t1,num;
for(i=1;i<10000;i++)
{
// m=i*i;
n=n+t;
for(j=i*i;j<=n;j++)
a[j]=k;
k++;
t=t+2;
}
scanf("%d",&t1);
for(k1=0;k1<t1;k1++)
{
scanf("%d",&num);
printf("%dn",a[num]);
}
free(a);
//getch();
return 0;
}
我使用valgrind运行了这个简单的代码。它给出了以下输出,我是valgrind的新手,所以请告诉我这是什么意思。
singu@singu-Studio-1450 ~ $ valgrind --leak-check=yes ./doors
==4732== Memcheck, a memory error detector
==4732== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==4732== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info
==4732== Command: ./doors
==4732==
==4732== Warning: set address range perms: large range [0x51c3040, 0x1cf3b440) (undefined)
==4732== Invalid write of size 4
==4732== at 0x400662: main (doors.c:16)
==4732== Address 0x1cf3b440 is 0 bytes after a block of size 400,000,000 alloc'd
==4732== at 0x4C28FAC: malloc (vg_replace_malloc.c:236)
==4732== by 0x400605: main (doors.c:6)
==4732==
^C==4732==
==4732== HEAP SUMMARY:
==4732== in use at exit: 400,000,000 bytes in 1 blocks
==4732== total heap usage: 1 allocs, 0 frees, 400,000,000 bytes allocated
==4732==
==4732== LEAK SUMMARY:
==4732== definitely lost: 0 bytes in 0 blocks
==4732== indirectly lost: 0 bytes in 0 blocks
==4732== possibly lost: 0 bytes in 0 blocks
==4732== still reachable: 400,000,000 bytes in 1 blocks
==4732== suppressed: 0 bytes in 0 blocks
==4732== Reachable blocks (those to which a pointer was found) are not shown.
==4732== To see them, rerun with: --leak-check=full --show-reachable=yes
==4732==
==4732== For counts of detected and suppressed errors, rerun with: -v
==4732== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 4 from 4)
Valgrind在这里基本上告诉你两件事:
1°您正在写入未分配的内存位置。这就是invalid write
消息的含义。此书写大小为4(整数),出现在门的第16行。
这可能是您的分段错误的原因。我的猜测是,您的a[j]出现在j的某些值的数组范围之外,因此您需要正确检查这一点(更具体地说,请记住数组是0索引的,因此大小为s的数组a的范围是a[0]到a[s-1])
你应该打印j并检查它是否小于10000,看看是否有问题。
2°退出时,您已完成1次分配,但0次空闲,因此您无法释放分配的400000字节。但是,在出口处仍然有一个指针,所以它是still reachable
。