在堆栈上使用内存

以下程序可能的行为是什么?

我试图在堆栈上分配和使用内存,并打印由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

下一篇: C function memory allocation