【发布时间】:2019-12-10 23:35:42
【问题描述】:
我正在学习堆栈的用法,我注意到它们在 C 和 Java 中的使用方式不同,或者显然是这样。例如,下面用 C 编写的代码将不起作用,因为它会破坏“名称”
char* getName(){
char name[32];
scanf( "%s",name);
return name;
}
int main (int argc, char *argv[]){
char *myName = getName();
printf("%s", myName);
}
但是,如果我用 Java 编写类似的东西,它就可以正常工作:
public static String getName(){
String name = "A name";
return name ;
}
static void main(String[] args){
String name = getName();
System.out.print(name);
}
我想知道为什么。为什么堆栈在 Java 中没有破坏,而在 C 中却如此?
【问题讨论】:
-
1.语言根本不同。 2. Java 通过垃圾收集使用内存管理,而 C 没有。 3. 你的 C 代码调用了未定义的行为; Java 已定义行为。
-
您的 Java 和 C 函数不等价。 C 变体正在使用输入来填充本地数组。 Java 变体只是简单地为字符串赋值。
char *name = "A name";更接近于您的 Java 函数,并且可以正常工作。 -
最好将 C++ (
std::string name) 与 Java 进行比较,因为它们都具有 C 完全缺乏的内存管理功能。这主要是因为 C 被设计为低级的,而 C++ 和 Java 具有建立在低级原语上的重要而深入的抽象层。 -
堆栈在 Java 中被破坏。只是将返回的函数局部变量放在堆上,在那里它们将被保留,直到不再有任何引用,然后被垃圾回收。这是语言的一部分。
-
Java 几乎不使用堆栈。所有对象都在堆上静默分配。 C 代码不起作用的原因不是因为某些“破坏者”,而是因为您向调用者返回了一个无效的指针。