C程序适用于我,但在线显示运行时错误

时间:2013-11-14 13:49:52

标签: c++ c

以下代码对我来说很好(代码块10.05)并且没有显示各种测试用例的编译时/运行时错误。 但是当我在编程网站上在线提交时,显示出运行时错误。

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

/*

 Here comes newPos()

*/
int main()

{
int t,i,n,k,j;
scanf("%d",&t);
int* a;

for(i=0;i<t;i++)
{
    scanf("%d",&n);
    free(a);

    a=(int*) malloc(n);

    for(j=0;j<n;j++)
        scanf("%d",&a[j]);
    scanf("%d",&k);

    printf("%d\n",newPos(a,n,k));

}


return 0;
}

然后我做了一些更改后将其更改为.cpp文件。 即,而不是免费(a)我使用该声明,删除一个;而不是a =(int *)malloc(n),我使用了语句,a = new int [n]; 然后它在我的编译器和在线上都成功执行了。

4 个答案:

答案 0 :(得分:6)

第一个错误:

您没有分配足够的内存来存储n整数值。所以你应该改变:

a=(int*) malloc(n);

为:

a=malloc(n * sizeof(int)); 

我也删除了演员,因为它没用,可以隐藏一个被遗忘的包含。

第二个错误:

在分配内存之前,您不能释放a。只在循环结束时释放内存。

C / C ++ mix:

在这个答案的评论中,人们正在谈论是否需要演员,特别是在C ++中。在C中,you should not cast

如果您愿意使用C ++代码,则应使用newdelete代替mallocfree。老实说,我不知道在使用malloc时C ++中是否需要强制转换,因为在C ++中,我总是使用new。但请不要使用C ++编译器编写C代码。根据您的需要在C和C ++之间进行选择。

答案 1 :(得分:3)

在分配之前你正在释放:

free(a); // This can lead to Undefined Behavior because a is containing some junk value
a=(int*) malloc(n);

此外,没有特别需要转换malloc的返回类型并检查你的malloc参数,你没有正确指定字节大小。但是在C ++中需要这种情况(因为你标记了C和C ++)。

Do I cast the result of malloc?

 a=(int*) malloc(n*sizeof(int));

答案 2 :(得分:2)

除了上面提到的分配大小问题之外,除非您已经分配了某些内容,或者已将free(a)初始化为值a,否则您无法NULL

答案 3 :(得分:0)

这是因为你对malloc()的论证是错误的。函数不知道你将使用什么“单位”,因此参数的单位总是“字节”。使用C ++的new[]运算符,它在语言中运行更高级别,因此可以考虑类型的大小。

因此,将您的分配更改为:

a = malloc(n * sizeof *a);

这将删除the pointless and annoying cast,并添加缺少的sizeof以根据每个指向对象中的字节数来缩放参数。这是记住malloc()用法的一种很好的形式。

也不要free()随机指针。