【问题标题】:Memory Location of a Pointer Declared Inside a Function函数内部声明的指针的内存位置
【发布时间】:2020-09-15 12:08:49
【问题描述】:

如果我在函数内部声明一个指针,它是在函数栈中还是在堆中?

例如:

typedef  uint32 my_element[16];
void foo()
{
my_element element* CSAAddress = 5;
}

在这种情况下,元素my_element在内存中的位置是什么?

【问题讨论】:

  • 如果您将指针设置为 0,那么它不会指向任何地方。您可以将其设置为其他数值,但随后它指向内存中的随机事物。如果您想将其指向您制作的对象,则需要制作该对象并将指针指向它。
  • 指针本身将存储在堆栈中。但它指向的位置取决于分配。
  • 元素定义是什么? my_element element* 是一种类型吗?

标签: c pointers memory heap-memory callstack


【解决方案1】:

您的指针将存储在堆栈中,但如果您动态分配内存,则分配的空间将在堆上分配。

另外,请注意您使用 my_element element* = 5; 指向随机内存空间 请注意您的表达式 - my_element element* CSAAddress = 5; 是一个语法错误。

注意:以下是指从下面提供的链接中列出与问题相关的要点

堆栈段用于存储内部创建的变量 函数(函数可以是主函数或用户定义的函数), 变量如 -

  • 函数的局部变量(包括指针变量)

  • 传递给函数的参数

  • 退货地址

为了回答您的问题,my_element 是一个将存储在堆栈中的指针。您还应该参考 this 以更好地了解变量的存储位置。

【讨论】:

  • 有足够多的编译器问题,我实际上不确定是什么意思。再看一行:my_element element* CSAAddress = 5;。这不会编译,因为my_element element 不是类型。
  • @DanielH 我写了答案,假设my_element 是用户定义的类型,必须在某处定义。我想这个问题需要编辑才能正确指定。
  • 无论如何,您不能将整数分配给 C 中的指针,除了 0 是一个空指针常量。
  • 另外,请注意您使用 my_element element* CSAAddress = 5; 指向随机内存空间我确实在我的回答中指出了这一点。
  • 是的,my_element是代码sn-p顶部的用户定义类型。但是my_element element 不是;这是一个语法错误。我不知道 OP 是指my_element element = 5CSAAddress 是一个不相关的变量),还是my_element* CSAAddress = 5,还是什么。
【解决方案2】:

您的示例在语法上无效。

为:

#include <stdint.h>
typedef  uint32_t my_element[16];
void foo(void) { my_element *element = 0; }

element 将具有自动存储期限

实现是否会使用堆栈、寄存器、完全优化变量 out(这三个最有可能)或 C 标准未指定的其他东西。

C 标准描述的是语义,而不是实现细节。

对于

#include <stdint.h>
typedef  uint32_t my_element[16];
void bar(void) { my_element *element = (my_element*)5; }

(需要强制转换以满足约束)该行为很可能是未定义的,因为生成的指针未充分对齐其目标类型会导致未定义的行为 (http://port70.net/~nsz/c/c11/n1570.html#6.3.2.3p7)。

此外,即使您创建了一个指向地址 5 的有效指针(例如,char *p5 = (char*)5;chars 具有最低对齐要求),它也不会很有用(可取消引用),因为操作系统通常不允许您将事物映射到该地址(在 Linux 上,您需要 root 权限才能映射第一个内存页)。

【讨论】:

    猜你喜欢
    • 2021-05-16
    • 1970-01-01
    • 2017-12-20
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多