我是 C 的初学者,想要在下面提到的2个不同代码中询问内存分配程序的差异:
#define MAX_LEN 10000
int main()
{
char str_new[MAX_LEN];
...
}
int main()
{
char str_new[10000];
...
}
这两个本质上不一样吗? 在这两个内存中不会以相同的方式分配内存吗? 在我搜索的问题中没有回答这个问题。虽然经常使用两种不同的方法。
答案 0 :(得分:3)
它们都是等价的。在第一个程序中,宏MAX_LEN
被10000
替换为简单的文本替换。
答案 1 :(得分:1)
在您的代码中,它们是相同的。在计算机视图中,它们总是一样的。
但是,想一想
char str_new_o1[10000];
char str_new_02[10000];
char str_new_03[10000];
char str_new_04[10000];
char str_new_05[10000];
...
char str_new_100[10000];
甚至可能他们在不同的文件中使用不同的文件。
所有数组都应该具有相同的大小(因为它们具有相同的含义)。他们现在好了。
但是,有一天,你发现你需要改变数组的大小,你现在需要2000,所以你需要更改所有这些数组one forget ,lots errors.
现在,我们称1000为魔数< / strong>。
然而,如果你将1000定义为marco,你只需要改变一次,不需要担心。
所以, 我们认为它们不同, 如果你只有一个数组,请直接使用数字,因为 不是必需的marco是邪恶的 ,如果你有很多相同大小的数组,请使用marco来获取幻数。
答案 2 :(得分:0)
是的,上述两种方法都会为str_new分配相同数量的内存。
这是因为静态内存分配是在编译时完成的,因为在预处理时解析了预处理程序指令。
答案 3 :(得分:0)
在编译过程中,主函数中的MAX_LEN
将被#define MAX_LEN
值替换,即10000.同样,所有MAX_LEN
都应该被替换。我认为编译后你的符号列表中将不再存在#define MAX_LEN
答案 4 :(得分:0)
他们都是一样的。
来自标准:
6.10.3 / 9宏替换
表单
的预处理指令#define identifier replacement-list new-line
定义一个类似于对象的宏,它使宏名称的每个后续实例都被构成指令其余部分的预处理标记的替换列表替换。
这意味着在预处理步骤中,编译器会将MAX_LEN
的所有出现替换为其值。所以:
#define MAX_LEN 10000
char str_new[MAX_LEN];
简单地翻译成:
char str_new[10000];