C/C++/ObjectiveC之间的内存差异,程序在 codepad.org 崩溃,但在Linux上不会崩溃

Memory difference between C/C++/ObjectiveC, program crashes on codepad.org but not on Linux

本文关键字:崩溃 org codepad 但在 Linux 程序 之间 ObjectiveC 内存 C++      更新时间:2023-10-16

不久前,当我写这样的东西时,我问自己:

   char* first(int howMany){
      return (char*)malloc(howMany);
   } 
   int main(){
      char*t;
      int one=20;
      t=first(20);  
   }

这段代码在 codepad.org 崩溃,但在 Mepis Linux 11.04 中,它只是引发了一些警告。

但是如果我为C++写这样的东西:

char* first(int howMany){
    return new char [howMany];
   }
int main(){
    char*t;
    int one=20;
    t=first(20);  
}

此代码工作正常。

我的问题是:

为什么 C 代码不起作用以及当我尝试

return (char*)malloc(howMany)

PS:如果我尝试在Objective-C中使用这个函数会发生什么?

(NSArray*) first(){
    return [NSArray array];
}

我没有崩溃 codepad.org,它会运行,但程序的退出状态指示错误。退出状态是未定义的,只是碰巧在堆栈上碰巧是什么,退出值(codepad.org 上恰好是 120)来自您的程序没有像它应该的那样从 main() 正确返回任何内容。

传统上,在 C 和 C++ 中,您必须显式地从 main() 返回一些东西。在后来的 C 和 C++ 标准中,这被更改了,因此如果你在没有 return 语句的情况下退出 main(),它会自动返回 0。(0 表示成功。

似乎已经发生的事情是,你有一个C++编译器,它尊重这个标准,(标准C++比标准C有这个规则的时间更长),如果main()没有返回任何东西,它默认返回0。

相比之下,codepad.org 上的 C 编译器似乎遵循较旧的标准,其中 main() 必须具有显式返回语句才能使程序有效。因此,有人可能会争辩说你的程序失败是因为 codepad.org 没有最新的 C 编译器,或者有人可能会争辩说你的程序应该更保守,而不是假设现代编译器,而是从 main() 显式返回

这就是为什么Mepis Linux上的编译器会警告你。它可能没有配置为遵循最新标准,因此警告您应该使用 return 语句结束 main() 函数。

因此,如果你想编写可以在任何地方工作的保守代码,你的main()函数应该总是return语句结尾。你的问题证明,如果你想让你的代码在"现实世界"中工作,依赖新标准的功能可能是危险的。

更改为目标 C 可能会更改其他内容,但主要问题(双关语)仍然是您没有明确地从 main() 返回值,以及目标 C 的 C 部分在特定编译器中遵循什么标准。

没有释放内存,可能会导致内存泄漏,但不是程序本身的错误,并且不会影响您观察到的问题。(事实上,在Linux上,退出程序会自动释放所有内存,这可能是草率的编程,但不是不正确的。

在这种情况下,

CC++ 的一个重要区别是,在 C++ 中,如果没有显式返回,main函数返回0。代码示例中就是这种情况,因此无论是否存在任何代码错误,它都被视为在C++中成功退出。