【问题标题】:Initializing Dynamically allocated integer初始化动态分配的整数
【发布时间】:2020-10-23 16:12:17
【问题描述】:

我猜动态创建的变量必须单独初始化,而不是在分配时。为什么下面的代码行不编译? 为什么我会在 'p' 之前收到错误消息“预期的 ')'。

*(int *p = malloc(sizeof(int))) = 23;

|

【问题讨论】:

  • 你可以用calloc()初始化为零
  • 我同意。但我的主要观点是错误消息的原因,我猜@chqrlie 给出了原因
  • 请注意,“初始化”在 C 中具有特定的含义,并且语义在某些方面与赋值不同。这里的变量是p,它在您的示例代码中进行了初始化。我不确定是否使用 @pmg 所指出的 calloc() 之类的东西是否符合 C 中变量初始化的语言律师定义,但如果不这样做,则根本没有办法正式“初始化”任何动态分配的对象C - 你必须 assign 值。同样,这是因为“赋值”与“初始化”不同。
  • @AndrewHenle:我同意将calloc() 分配的空间称为“初始化”可能会扭曲“语言律师”方面。虽然C11 7.22.3.2 在 p2 中说:“......空间被初始化为所有位为零。”

标签: c initialization malloc expression declaration


【解决方案1】:

定义int *p 不能出现在表达式中,这是语法错误。您必须使用定义和单独的表达式来初始化内容:

int *p = malloc(sizeof(int));
*p = 23;

或

int *p;
*(p = malloc(sizeof(int))) = 23;

请注意,在内存分配失败的情况下,上述两种形式都有未定义的行为。

【讨论】:

    【解决方案2】:

    这个

    int *p = malloc(sizeof(int))
    

    是变量p的声明。

    你不能像表达式一样使用声明。

    所以你需要分割这条线

    *(int *p = malloc(sizeof(int))) = 23;
    

    两行类似

    int *p = malloc(sizeof(int));
    

    和

    *p = 23;
    

    另一种方式是首先声明变量p

    int *p;
    

    然后在表达式中使用声明的变量

    *( p = malloc( sizeof( int ) ) ) = 23;
    

    【讨论】:

      猜你喜欢
      • 2020-05-04
      • 1970-01-01
      • 2015-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-08
      • 1970-01-01
      相关资源
      最近更新 更多