函数内的指针变量指向堆栈还是堆?
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;
调用未定义的行为,顺便说一句,myVar
、input
都存储在堆栈上
【参考方案1】:
变量myVar
在堆栈上(对于将局部变量存储在堆栈上的编译器),但它并不指向任何地方。这意味着当您取消引用它时,您会有未定义的行为。
从技术上讲,myVar
的值是不确定的(即看似随机的),因此它将指向一个随机位置。这意味着取消引用可能有时会导致崩溃,而其他时候可能不会。
【讨论】:
我不会说它是随机的。然后有人出现并想将未分配的内存用作PRNG ...(找不到问题,但是有一个这样的...) @glglgl:你的意思是像臭名昭著的Debian OpenSSL implementation? @glglgl 这就是我说看似随机的原因。【参考方案2】:当我尊重它时,编译器如何处理内存分配
解除引用指针的值(地址)不会分配内存。 取消引用只是让您访问引用的内存,即指针指向的内存。
从哪里分配内存(如果有的话)取决于分配给指针的内容。 ls.
注意:取消引用未初始化的指针会引发未定义的行为,就像对未初始化内存/变量的任何读取访问一样。
【讨论】:
你的意思是在典型的嵌入式系统中它指向 .BSS(未初始化的数据部分)吗? @Chen:它可以指向任何地方。在 C 中,除了声明为static
的变量外,没有默认初始化,默认为 0
。以上是关于函数内的指针变量指向堆栈还是堆?的主要内容,如果未能解决你的问题,请参考以下文章