我是C的初学者,想问一下下面提到的 2 个不同代码中内存分配过程的区别:
#define MAX_LEN 10000
int main()
{
char str_new[MAX_LEN];
...
}
int main()
{
char str_new[10000];
...
}
这两个本质上不一样吗??这两个内存分配方式会不会一样?这在我搜索的问题中没有得到回答。尽管经常使用这两种不同的方法。
我是C的初学者,想问一下下面提到的 2 个不同代码中内存分配过程的区别:
#define MAX_LEN 10000
int main()
{
char str_new[MAX_LEN];
...
}
int main()
{
char str_new[10000];
...
}
这两个本质上不一样吗??这两个内存分配方式会不会一样?这在我搜索的问题中没有得到回答。尽管经常使用这两种不同的方法。
它们都是等价的。在第一个程序中,宏MAX_LEN
被10000
简单的文本替换替换。
在您的代码中,它们是相同的。在计算机视图中,它们总是相同的。
但是,想想如果你有
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 称为幻数。
而如果将1000定义为marco,则只需更改一次,无需担心。
所以,在我们看来,它们是不同的,如果你只有一个数组,直接使用数字,因为不必要的宏是邪恶的,而如果你有很多相同大小的数组,使用宏来避免幻数。
在编译过程中,MAX_LEN
您的 main 函数中的 将被您的#define MAX_LEN
值替换,即 10000。此外,MAX_LEN
应该替换所有 我认为#define MAX_LEN
编译后您的符号列表中将不再存在
他们都是一样的。
从标准:
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];
是的,上述两种方法都会为 str_new 分配相同数量的内存。
这是因为静态内存分配是在编译时完成的,而预处理器指令是在预处理时解析的。