【发布时间】:2021-04-10 10:46:31
【问题描述】:
char buf[100] 行是否在堆栈中分配任何内存?我假设它不是因为它只是一个声明。当我在运行下面两个不同的代码段后打印 buf 的地址时(一个用“test”填充 buf,另一个用“test test”填充),我得到不同的地址。这是否意味着buf实际上不是100字节,而在第一种情况下只有5个字节(空字符+1),在第二种情况下只有10个字节?
char buf[100];
strcpy(buf, "test");
对比
char buf[100];
strcpy(buf, "test test");
【问题讨论】:
-
“这只是一个声明”......不,这是一个定义。声明为
extern char buf[100];如果多次运行同一个程序,每次运行可能会得到不同的地址。 -
strcpy 不分配内存
-
差异的一个原因是地址空间随机化
-
在块作用域中,每一个没有声明文件作用域对象(函数decl或extern对象decl)的声明也是一个定义。
-
@nquisitivemongoose 提供一个演示问题的最小完整程序。