函数内的指针变量指向堆栈还是堆?

Posted

技术标签:

【中文标题】函数内的指针变量指向堆栈还是堆?【英文标题】:Pointer variable inside a function points to stack or heap? 【发布时间】:2014-02-16 10:36:07 【问题描述】:
void foo (char *input) 
  char *myVar;
  *myVar = *input;

我知道如果我使用malloc(sizeof(char) 分配myVar 内存,它将指向,但是如果我不分配内存怎么办,当我尊重它时,编译器如何处理内存分配?它会分配在 stack 还是 heap 中?

【问题讨论】:

取消引用指针不涉及内存分配。所以你的代码只是表现出未定义的行为 但是在这个 sn-p 中分配给一个取消引用的 indeterminate 指针有一个很好的未定义行为 在您的代码中 *myVar = *input; 调用未定义的行为,顺便说一句,myVarinput 都存储在堆栈上 【参考方案1】:

变量myVar 在堆栈上(对于将局部变量存储在堆栈上的编译器),但它并不指向任何地方。这意味着当您取消引用它时,您会有未定义的行为

从技术上讲,myVar 的值是不确定的(即看似随机的),因此它将指向一个随机位置。这意味着取消引用可能有时会导致崩溃,而其他时候可能不会。

【讨论】:

我不会说它是随机的。然后有人出现并想将未分配的内存用作PRNG ...(找不到问题,但是有一个这样的...) @glglgl:你的意思是像臭名昭著的Debian OpenSSL implementation? @glglgl 这就是我说看似随机的原因。【参考方案2】:

当我尊重它时,编译器如何处理内存分配

解除引用指针的值(地址)不会分配内存。 取消引用只是让您访问引用的内存,即指针指向的内存。

从哪里分配内存(如果有的话)取决于分配给指针的内容。 ls.

注意:取消引用未初始化的指针会引发未定义的行为,就像对未初始化内存/变量的任何读取访问一样。

【讨论】:

你的意思是在典型的嵌入式系统中它指向 .BSS(未初始化的数据部分)吗? @Chen:它可以指向任何地方。在 C 中,除了声明为 static 的变量外,没有默认初始化,默认为 0

以上是关于函数内的指针变量指向堆栈还是堆?的主要内容,如果未能解决你的问题,请参考以下文章

在带有指向堆栈变量的指针的函数调用之间使用传输值(按值?)

将指针传递给函数并更改它指向的地址[重复]

存储在堆栈或堆中的对象方法?

数据压入堆栈时,ESP寄存器的指向?

将指向局部变量的指针传递给函数:它安全吗?

指针函数不可以返回局部变量地址解决