gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 05:07:49 25 4
gpt4 key购买 nike

前一段时间我问自己,当我写这样的东西时:

   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 代码不起作用,当我尝试时会发生什么

返回 (char*)malloc(howMany)?

P.S: 如果我试图在 Objective-C 中使用这个函数会发生什么?

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

最佳答案

我在 codepad.org 中没有崩溃,它runs ,但程序的退出状态指示错误。退出状态未定义,恰好是 on the stack机缘巧合,退出值(it happens to be 120 on codepad.org)来自您的程序没有从 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() 函数应该 always end with a return statement .您的问题本身就证明,如果您希望您的代码在“现实世界”中运行,那么依赖更新标准的功能可能是危险的。

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

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

关于c++ - C/C++/ObjectiveC 之间的内存差异,程序在 codepad.org 上崩溃,但在 Linux 上不会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11030148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com