在堆栈上使用内存

时间:2014-08-20 08:06:50

标签: c stack

以下该计划的可能行为是什么?

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

4 个答案:

答案 0 :(得分:2)

根据你已经知道堆栈上char mem[10];的内存,当函数返回时它不可用。所以我只是说它会导致你Undefined Behavior

答案 1 :(得分:0)

这是因为在函数返回之后,堆栈不可用,但是你从该函数返回该位置的地址,该函数将存储在指针p中,因此程序不会崩溃但会产生垃圾值。

答案 2 :(得分:0)

  

为什么程序不会崩溃,或打印一些随机垃圾?

由于您没有访问任何非法内存,程序不会崩溃。堆栈内存是程序的一部分,只要您在有效范围内访问内存,程序就不会崩溃。是的,您可以修改堆栈内存,无论该函数是否在该堆栈帧中。

现在访问不在当前堆栈帧中的内存将导致未定义行为。这取决于编译器。大多数编译器都会打印垃圾值。我不知道你使用的是哪个编译器!

我想说试着理解C / C ++程序中堆栈内存的基本概念。我建议你也看一下堆内存。

答案 3 :(得分:0)

在这里,程序不会崩溃,而是会打印一些垃圾值。当它将返回堆栈将无法使用,因此将给出垃圾值。