C 程序适用于我,但在线显示运行时错误
Posted
技术标签:
【中文标题】C 程序适用于我,但在线显示运行时错误【英文标题】:C Program works for me but shows runtime error online 【发布时间】:2013-11-14 13:49:51 【问题描述】:以下代码对我来说运行良好(代码块 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]; 然后它在我的编译器和在线上都成功执行了。
【问题讨论】:
在第一次迭代中,您释放了一个悬空指针。将a
初始化为NULL
。
正如您所发现的“为我工作”!=“没有错误”。对于 C 或 C++ 程序员来说,这是非常重要的一课。
仅供参考,在 C++ 中,您应该在 new T[n]
之后使用 delete[]
(而不是 delete
)。
这段代码中确实没有c++。也许应该删除 c++ 标签。
@drescherjm 在程序下面我包含了我如何将动态分配更改为 c++ 并且它起作用了。
【参考方案1】:
第一个错误:
您没有分配足够的内存来存储n
整数值。所以你应该改变:
a=(int*) malloc(n);
到:
a=malloc(n * sizeof(int));
我还删除了演员表,因为它没用并且可能隐藏被遗忘的包含。
第二个错误:
在分配内存之前,您不能释放a
。仅在循环结束时释放内存。
C/C++ 混合:
在这个答案的 cmets 中,人们在谈论是否需要强制转换,特别是在 C++ 中。在 C 中,you should not cast。
如果你愿意做C++代码,你应该使用new
和delete
而不是malloc
和free
。老实说,我不知道在 C++ 中使用 malloc
时是否需要强制转换,因为在 C++ 中,我总是使用 new
。但是,请不要使用 C++ 编译器编写 C 代码。根据您的需要在 C 和 C++ 之间进行选择。
【讨论】:
@Acme:这两个问题都不是“the”问题,因为至少有两个;但这肯定是其中之一。 @Acme 问题不在于演员阵容,而在于malloc
的参数。
@Acme:抱歉,不清楚您所说的“那个”是什么意思。不过,没有理由不删除毫无意义的演员表。
@Acme 如果您阅读了这个问题,它会说在 C++ OP 中使用 new
而不是 malloc
。所以 malloc
不需要强制转换,因为它只在 C 中使用。
如果您使用 C++,那么您应该使用new
和delete
,而不是malloc
和free
(并且可能不使用printf
,而是cout
)。 【参考方案2】:
在分配之前你正在释放:
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));
【讨论】:
【参考方案3】:除了提到的分配大小问题之外,你不能free(a)
除非你已经分配了一些东西,或者已经初始化了a
以具有NULL
的值。
【讨论】:
【参考方案4】:这是因为您对malloc()
的论点是错误的。该函数不知道您将使用什么“单位”,因此参数的单位始终是“字节”。使用 C++ 的 new[]
运算符,它在语言中运行更高级别,因此它可以考虑类型的大小。
因此,将分配更改为:
a = malloc(n * sizeof *a);
这将删除the pointless and annoying cast,并添加缺少的sizeof
,以按每个指向对象中的字节数缩放参数。这是malloc()
的一种很好的用法,要记住。
也不要free()
随机指针。
【讨论】:
以上是关于C 程序适用于我,但在线显示运行时错误的主要内容,如果未能解决你的问题,请参考以下文章