在堆栈上使用内存
以下程序可能的行为是什么?
我试图在堆栈上分配和使用内存,并打印由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("%sn", p);
for(int i = 0; i<10; i++){
printf("%cn", p[i]);
}
return 0;
}
为什么不是程序崩溃,或打印一些随机垃圾?
由于您没有访问任何非法内存,程序不会崩溃。 堆栈内存是您程序的一部分,只要您在有效范围内访问内存,程序就不会崩溃。 是的,您可以修改堆栈内存,而不管该函数是否在该堆栈框架中。
现在访问不在当前堆栈帧中的内存将导致未定义的行为 。 这是编译器的依赖。 大多数编译器会打印垃圾值。 我不知道你使用的是哪个编译器!
我想说的是尝试理解C / C ++程序中堆栈内存的基本概念。 我建议也看看堆内存。
正如你已经知道char mem[10];
内存char mem[10];
并且在函数返回时它不可用。 所以我只说它会导致你未定义的行为。
这是因为在函数返回之后,堆栈不可用,但是从返回存储在指针p中的那个函数返回该位置的地址,所以程序不会崩溃,而是给出垃圾值。
链接地址: http://www.djcxy.com/p/79903.html上一篇: Use memory on stack