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++代码,你应该使用newdelete而不是mallocfree。老实说,我不知道在 C++ 中使用 malloc 时是否需要强制转换,因为在 C++ 中,我总是使用 new。但是,请不要使用 C++ 编译器编写 C 代码。根据您的需要在 C 和 C++ 之间进行选择。

【讨论】:

@Acme:这两个问题都不是“the”问题,因为至少有两个;但这肯定是其中之一。 @Acme 问题不在于演员阵容,而在于malloc 的参数。 @Acme:抱歉,不清楚您所说的“那个”是什么意思。不过,没有理由不删除毫无意义的演员表。 @Acme 如果您阅读了这个问题,它会说在 C++ OP 中使用 new 而不是 malloc。所以 malloc 不需要强制转换,因为它只在 C 中使用。 如果您使用 C++,那么您应该使用newdelete,而不是mallocfree(并且可能不使用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 程序适用于我,但在线显示运行时错误的主要内容,如果未能解决你的问题,请参考以下文章

打开经常模板时出现运行时错误

Lua C API:设置错误源信息

dll 运行时错误(C/C++/GCC/MSVC)

Websocket 部署后会出现错误 500,但适用于开发

更新到 Xcode 13,尝试在 iOS 但不是 macOS 上运行 SwiftUI 应用程序时获得唯一的错误代码

我收到 mysqli_stmt_init 的连接错误,但没有显示错误