【问题标题】:Using #define in defining string size C使用#define 定义字符串大小 C
【发布时间】:2013-08-10 10:54:54
【问题描述】:

我是C的初学者,想问一下下面提到的2个不同代码中内存分配过程的区别:

#define MAX_LEN 10000
int main()
{
char str_new[MAX_LEN];
...
}


int main()
{
char str_new[10000];
...
}

这两个本质上不是一样的吗? 这两个内存分配方式会不会一样? 这在我搜索的问题中没有得到回答。虽然这两种不同的方法都经常使用。

【问题讨论】:

  • 你需要了解编译的不同阶段。尝试阅读预处理器上的一些内容。
  • 是的,它们是相同的——在实际编译之前执行直接字符替换,因此您最终会编译相同的字符。需要注意的是编码#define MAX_LEN = 10000#define MAX_LEN 10000;,因为它们包含您不想替换的字符。
  • 另外,如果你曾经包含一个表达式,用()包围它。例如,如果你先编码#define MY_CONST 5 + 10,然后再编码int x = MY_CONST * 3;,你会得到int x = 5 + 10 * 3;,结果是35而不是45。所以编码#define MY_CONST (5 + 10)

标签: c string c-preprocessor


【解决方案1】:

它们都是等价的。在第一个程序中,宏 MAX_LEN 通过简单的文本替换替换为 10000

【讨论】:

  • 那么我们如何在输入时改善内存分配,一个字符
  • @user2669913 1. 询问用户输入的长度,然后分配一个 VLA。或者,2.您使用足够小(但足够大)、大小恒定的缓冲区,使用fgets() 获取用户输入,然后将其附加到动态可扩展缓冲区的末尾。
【解决方案2】:

在您的代码中,它们是相同的。在计算机视图中,它们总是相同的。

但是,想想如果你有

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 称为 Magic Number .

而如果你把1000定义为一个marco,你只需要改变一次,不用担心。

所以,在我们看来它们是不同的,如果你只有一个数组,直接使用数字,因为一个不必要的marco是邪恶的,如果你有很多相同大小的数组,使用marco来避免ma​​gic number

【讨论】:

    【解决方案3】:

    是的,上述两种方法都会为 str_new 分配相同数量的内存。

    这是因为静态内存分配是在编译时完成的,而预处理器指令在预处理时被解析。

    【讨论】:

      【解决方案4】:

      在编译过程中,你的 main 函数中的MAX_LEN 将被你的#define MAX_LEN 值替换,即10000。另外,所有的MAX_LEN 都应该被替换。我认为#define MAX_LEN 编译后将不再存在于您的符号列表中

      【讨论】:

        【解决方案5】:

        它们都是一样的。

        来自标准:

        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];
        

        【讨论】:

          猜你喜欢
          • 2015-07-06
          • 1970-01-01
          • 1970-01-01
          • 2022-12-17
          • 2017-08-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多