0

以下代码对我来说运行良好(代码块 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 文件。即,我使用的语句不是 free(a),而是 delete a; 而不是 a=(int*) malloc(n),我使用了语句 a=new int[n]; 然后它在我的编译器和在线都成功执行。

4

4 回答 4

6

第一个错误:

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

a=(int*) malloc(n);

至:

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

我还删除了演员表,因为它没用并且可以隐藏被遗忘的包含。

第二个错误:

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

C/C++ 混合:

在这个答案的评论中,人们正在谈论是否需要强制转换,特别是在 C++ 中。在 C 中,您不应该强制转换.

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

于 2013-11-14T13:50:52.763 回答
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++)。

我要转换 malloc 的结果吗?

 a=(int*) malloc(n*sizeof(int));
于 2013-11-14T13:52:35.630 回答
2

除了提到的分配大小问题之外,free(a)除非您已经分配了一些东西,或者已经初始化a为具有 value ,否则您不能这样做NULL

于 2013-11-14T13:52:35.030 回答
0

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

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

a = malloc(n * sizeof *a);

这消除了无意义和烦人的 cast,并且还添加了缺失sizeof值以按每个指向对象中的字节数缩放参数。这是一种很好的malloc()用法,需要记住。

也不要free()随机指针。

于 2013-11-14T13:52:57.140 回答