【发布时间】: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