以下代码对我来说很好(代码块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]; 然后它在我的编译器和在线上都成功执行了。
答案 0 :(得分:6)
您没有分配足够的内存来存储n
整数值。所以你应该改变:
a=(int*) malloc(n);
为:
a=malloc(n * sizeof(int));
我也删除了演员,因为它没用,可以隐藏一个被遗忘的包含。
在分配内存之前,您不能释放a
。只在循环结束时释放内存。
在这个答案的评论中,人们正在谈论是否需要演员,特别是在C ++中。在C中,you should not cast。
如果您愿意使用C ++代码,则应使用new
和delete
代替malloc
和free
。老实说,我不知道在使用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()
随机指针。