【问题标题】:Use memory on stack在堆栈上使用内存
【发布时间】:2014-10-13 12:21:38
【问题描述】:

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

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

【问题讨论】:

  • 这些是非常基本的概念,涵盖在任何 2 分钟搜索将挖掘出的无数教程的第一章中。

标签: c stack


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

    我想说尝试理解 C/C++ 程序中堆栈内存的基本概念。我建议还研究堆内存。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2011-02-11
          • 2011-08-01
          • 2021-09-22
          • 2017-12-21
          • 2011-08-15
          • 1970-01-01
          • 2015-09-08
          • 1970-01-01
          • 2017-02-08
          相关资源
          最近更新 更多