以下该计划的可能行为是什么?
我试过在堆栈上分配和使用内存, 并打印由p指向的内存块,输出为' \ 0'。
的字符技术上我知道函数返回时它不可用。
但是,为什么程序不会崩溃,或打印一些随机垃圾?
#include <cstring>
#include <cstdio>
#include <cstdlib> //malloc
char* getStackMemory(){
char mem[10];
char* p = mem;
return p;
}
int main(){
char* p = getStackMemory();
strcpy(p, "Hello!");
printf("%s\n", p);
for(int i = 0; i<10; i++){
printf("%c\n", p[i]);
}
return 0;
}
答案 0 :(得分:2)
根据你已经知道堆栈上char mem[10];
的内存,当函数返回时它不可用。所以我只是说它会导致你Undefined Behavior。
答案 1 :(得分:0)
这是因为在函数返回之后,堆栈不可用,但是你从该函数返回该位置的地址,该函数将存储在指针p中,因此程序不会崩溃但会产生垃圾值。
答案 2 :(得分:0)
为什么程序不会崩溃,或打印一些随机垃圾?
由于您没有访问任何非法内存,程序不会崩溃。堆栈内存是程序的一部分,只要您在有效范围内访问内存,程序就不会崩溃。是的,您可以修改堆栈内存,无论该函数是否在该堆栈帧中。
现在访问不在当前堆栈帧中的内存将导致未定义行为。这取决于编译器。大多数编译器都会打印垃圾值。我不知道你使用的是哪个编译器!
我想说试着理解C / C ++程序中堆栈内存的基本概念。我建议你也看一下堆内存。
答案 3 :(得分:0)
在这里,程序不会崩溃,而是会打印一些垃圾值。当它将返回堆栈将无法使用,因此将给出垃圾值。