【问题标题】:Are the variables stored on Heap or Stack in C programming language? [closed]变量是存储在 C 编程语言中的堆还是堆栈中? [关闭]
【发布时间】:2017-10-06 22:58:01
【问题描述】:

假设你有代码:

int main(void)
{
    int a=10;
    char b[10]="HELLO";
    const int x=10;
    return 0;
}

如有错误请指正:

"a" 将仅存储在堆栈中(根本不存储在数据段中)及其值(10)

“b”将作为指针存储在堆栈中(因为我认为数组是指向第一个元素的指针),“HELLO”将存储在堆中(就像我们使用 malloc 一样)。

“x”可以存储在数据、堆栈或文本中,具体取决于编译器。

【问题讨论】:

  • @MosabShaheen 不,不是。数组就是数组。指针是指针。在某些情况下(例如,将其传递给函数时),数组可能会“衰减”为指向第一个元素的指针。为了证明,请尝试打印出 sizeof(b)sizeof(char*)
  • @MosabShaheen 你读过我的完整评论了吗?您不能按值将数组传递给函数(如printf)。它们衰减为指向第一个元素的指针。改为运行:printf("sizeof(b)=%zu sizeof(&b[0])=%zu\n", sizeof(b), sizeof(&b[0])); sizeof 是一个运算符,结果在编译时确定(不会发生衰减)。
  • @MosabShaheen 数组的地址没有存储在任何地方,就像代码中的 a 的地址没有存储在任何地方一样。 b 是一个数组。 sizeof(b) 返回 b 占用的字节数,这也恰好是元素的数量,因为它是 char 的数组。用int b[10] 替换它,你应该得到40(假设sizeof(int)==4)。请用谷歌搜索数组衰减以更好地理解。
  • sizeof 正在“检测” b 作为数组,因为 b 是数组而不是指针。请参阅stackoverflow.com/questions/1641957/… 以帮助解释数组和指针之间的区别。你错了。对不起。

标签: c heap-memory stack-memory


【解决方案1】:

“a”将仅存储在堆栈中(数据段不可能)及其值(10)

正确。

“b”将作为指针(因为数组是指向第一个元素的指针)存储在堆栈中,“HELLO”将存储在堆中(就像我们使用 malloc 一样)。

不正确。

把那行想象成:

char b[10];
strcpy(b, "HELLO");

b 是一个数组,而不是一个指针。堆栈内存用于数组。

“x”可以存储在数据、堆栈或文本中,具体取决于编译器。

正确。

【讨论】:

  • bro 数组是指向数组第一个元素的固定指针(不可修改),char * b 是动态指针,但两者都是指针。
  • @MosabShaheen,你是在问还是在说?
  • @MosabShaheen,在许多表达式中,数组衰减为指针,但数组与指针不同。这可能会有所帮助:stackoverflow.com/questions/1641957/…
  • @MosabShaheen,请参阅stackoverflow.com/questions/17506138/… 的已接受答案。你必须相信,如果答案是错误的,它会像疯了一样被否决而不是开始投赞成票。
猜你喜欢
  • 2017-11-05
  • 2021-10-13
  • 2021-06-19
  • 2011-08-25
  • 2013-05-26
  • 2019-09-12
  • 2015-05-03
  • 2019-09-08
相关资源
最近更新 更多